NSOperation有多个长期任务

时间:2013-02-21 12:45:38

标签: ios nsoperation nsoperationqueue

根据我的理解,NSOperation的长期任务应该在其main函数中实现,一旦将NSOperation添加到NSOperationQueue,它就会被触发

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

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

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

我能想到的唯一解决方案是将两个任务都移到main函数中,并在运行时决定执行哪个任务:

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

但我想有必要有更好的方法来实现这个目标吗?

另外:如何使用并发操作获得相同的结果?

1 个答案:

答案 0 :(得分:1)

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

[secondOperation addDependency:firstOperation];

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

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

[operationQueue setMaxConcurrentOperationCount:1];

在这种情况下,您不需要设置依赖项,添加第一个和第二个NSOperation的顺序将决定它们的运行顺序。

如何使用并发操作获得相同的结果?

NSOperationQueueNSOperations的主要目的是使非并发任务并发。如果您的代码尚未涉及某种并发任务,则没有理由使用并发NSOperation

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

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