在我的理解中,NSOperation
的长时间运行的任务应该在它的 main
函数中实现,一旦 NSOperation
就会触发它被添加到 NSOperationQueue
。
这对我来说很好,直到现在,我的 NSOperation
有不止一项主要任务。
第一个任务是解析一个文档(打开文档时应该只应用一次)。
第二个任务是将 NSData
附加到文档中(对于打开的文档可以多次调用)。
我能想到的唯一解决方案是将两个任务都移到 main
函数中,并在运行时决定执行哪个任务:
- (void)main
{
@autoreleasepool
{
if(firstTaskTsDone)
{
[self doSecondTask];
}
else
{
[self doFirstTask];
firstTaskTsDone = YES;
}
}
}
但我想一定有更好的方法来实现这一点?
另外:如何使用并发操作获得相同的结果?
您应该为第二个任务创建第二个 NSOperation
。您可以使用:
[secondOperation addDependency:firstOperation];
使第二个操作的开始依赖于第一个操作的完成。然后,您可以将这两个操作添加到 NSOperationQueue
。在第二个操作中,您可以使用它的 dependencies
属性来访问第一个操作并提取第二个操作可能需要完成其任务的任何数据。
另一种方法是将 NSOperationQueue
配置为串行队列:
[operationQueue setMaxConcurrentOperationCount:1];
在这种情况下,您不需要设置依赖项,添加第一个和第二个 NSOperation
的顺序将决定它们的运行顺序。
如何使用并发操作实现相同的结果?
NSOperationQueue
和 NSOperations
主要目的是使非并发任务并发。如果您的代码还没有涉及某种并发任务,那么没有理由使用并发 NSOperation
。
并发任务的一个常见示例是 NSURLConnection
请求。这通常包含在并发 NSOperation
中,因此可以将其添加到 NSOperationQueue
作为更长进程的一部分,而其他 NSOperations
将被添加到处理请求结果的队列。
当 main
方法返回时,一个普通的 NSOperation
就完成了。如果您在 main
中异步启动 NSURLConnection
,您将在连接完成之前立即返回。通过将其配置为并发操作,您负责在连接实际完成时向 NSOperationQueue
发出信号。
关于ios - NSOperation 有多个长任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002606/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |