Ios 具有多个长任务的NSO操作

Ios 具有多个长任务的NSO操作,ios,nsoperation,nsoperationqueue,Ios,Nsoperation,Nsoperationqueue,根据我的理解,NSOperation的长时间运行任务应该在其main功能中实现,一旦NSOperation添加到NSOperationQueue中,它就会被触发 这对我来说很好,直到现在,我的NSOperation有不止一个主要任务 第一个任务是解析文档(打开文档时只应用一次) 第二个任务是将NSData附加到文档中(对于打开的文档可以多次调用) 我能想到的唯一解决方案是将这两个任务移动到main函数中,并在运行时决定执行哪个任务: - (void)main { @autorelease

根据我的理解,
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];
在这种情况下,您不需要设置依赖项,添加第一个和第二个操作的顺序将决定它们的运行顺序

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

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

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

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