根据我的理解,NSOperation
的长期任务应该在其main
函数中实现,一旦将NSOperation
添加到NSOperationQueue
,它就会被触发
这对我来说很好,直到现在,我的NSOperation
还有一个以上的主要任务。
第一项任务是解析文档(打开文档时只应该应用一次)。
第二项任务是将NSData
附加到文档中(对于打开的文档可以多次调用)。
我能想到的唯一解决方案是将两个任务都移到main
函数中,并在运行时决定执行哪个任务:
- (void)main
{
@autoreleasepool
{
if(firstTaskTsDone)
{
[self doSecondTask];
}
else
{
[self doFirstTask];
firstTaskTsDone = YES;
}
}
}
但我想有必要有更好的方法来实现这个目标吗?
另外:如何使用并发操作获得相同的结果?
答案 0 :(得分:1)
您应该为第二个任务创建第二个NSOperation
。您可以使用:
[secondOperation addDependency:firstOperation];
使第二次操作开始取决于第一次操作完成。然后,您可以将这两个操作添加到NSOperationQueue
。在第二个操作中,您可以使用其dependencies
属性来访问第一个操作,并提取第二个操作可能需要完成任务的任何数据。
另一种方法可能是将NSOperationQueue
配置为串行队列:
[operationQueue setMaxConcurrentOperationCount:1];
在这种情况下,您不需要设置依赖项,添加第一个和第二个NSOperation
的顺序将决定它们的运行顺序。
如何使用并发操作获得相同的结果?
NSOperationQueue
和NSOperations
的主要目的是使非并发任务并发。如果您的代码尚未涉及某种并发任务,则没有理由使用并发NSOperation
。
并发任务的一个常见示例是NSURLConnection
请求。这通常包含在并发NSOperation
中,因此可以作为较长进程的一部分添加到NSOperationQueue
,其中将其他NSOperations
添加到队列以处理请求的结果
NSOperation
方法返回时,正常main
结束。如果您在NSURLConnection
中异步启动main
,则会在连接完成之前立即返回。通过将其配置为并发操作,您将负责在连接实际完成时向NSOperationQueue
发送信号。