2

在我的理解中,一个长期运行的任务NSOperation应该在它的main函数中实现,一旦NSOperation被添加到一个NSOperationQueue.

这对我来说很好,直到现在,我NSOperation的主要任务不止一项。

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

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

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

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

但我想一定有更好的方法来实现这一点?

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

4

1 回答 1

1

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

[secondOperation addDependency:firstOperation];

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

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

[operationQueue setMaxConcurrentOperationCount:1];

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

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

NSOperationQueueNSOperations主要目的是使非并发任务并发。如果您的代码还没有涉及某种并发任务,那么就没有理由使用 concurrent NSOperation

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

当方法返回时,正常NSOperation完成。main如果您在连接完成之前开始NSURLConnection异步,main您将立即返回。通过将其配置为并发操作,您负责通知NSOperationQueue连接实际完成的时间。

于 2013-02-21T13:23:13.250 回答