2013-02-21 30 views
2

根据我的理解,NSOperation的长期运行任务应该在其main函数中实现,在NSOperation被添加到NSOperationQueue之后,它会被触发。NSOperation有一个以上的长时间任务

这对我来说很好,直到现在,我的NSOperation有一个以上的主要任务。

第一项任务是解析一个文档(在打开文档时应该只应用一次)。

第二项任务是将NSData附加到文档(对于打开的文档可以多次调用)。

我能想到的唯一的办法就是这两个任务移动到main功能,并在运行时执行该任务的决定:

- (void)main 
{ 
    @autoreleasepool 
    { 
     if(firstTaskTsDone) 
     { 
      [self doSecondTask]; 
     } 
     else 
     {  
      [self doFirstTask]; 
      firstTaskTsDone = YES; 
     } 
    } 
} 

但我想,必须有一个更好的方式来实现这一目标?

ALSO:如何使用并发操作实现相同的结果?

回答

1

您应该为第二项任务创建第二个NSOperation。您可以使用:

[secondOperation addDependency:firstOperation]; 

使第二个操作依赖于第一个操作完成而开始。然后,您可以将这两个操作添加到NSOperationQueue。在第二个操作中,您可以使用其dependencies属性访问第一个操作并提取第二个操作可能需要的任何数据以完成其任务。

另一种方法可以是将NSOperationQueue配置是一个串行队列:

[operationQueue setMaxConcurrentOperationCount:1]; 

在这种情况下,你不会需要设置的依赖关系,并在其中添加了第一和第二NSOperation将决定顺序它们的运行顺序。

如何使用并发操作实现相同的结果?

NSOperationQueue and NSOperations主要目的是使并发的非并行任务。如果你的代码还没有涉及某种并发任务,那么没有理由使用并发的NSOperation

并发任务的一个常见示例是NSURLConnection请求。这通常包含在并发NSOperation中,因此它可以作为更长进程的一部分添加到NSOperationQueue,其中其他NSOperations将被添加到队列以处理请求的结果。

main方法返回时,正常NSOperation完成。如果您在main中异步启动了NSURLConnection,则在连接完成之前您将立即返回。通过将其配置为并发操作,当连接实际完成时,您负责向NSOperationQueue发信号通知。

相关问题