【问题标题】:NSOperation with more than one long taskNSOperation 有多个长任务
【发布时间】:2013-02-21 12:45:37
【问题描述】:

据我了解,NSOperation 的长期运行任务应在其main 函数中实现,一旦将NSOperation 添加到NSOperationQueue 就会触发它。

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios nsoperation nsoperationqueue


    【解决方案1】:

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

    [secondOperation addDependency:firstOperation];
    

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

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

    [operationQueue setMaxConcurrentOperationCount:1];
    

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

    如何使用并发操作实现相同的结果?

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多