• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - NSOperation 有多个长任务

[复制链接]
菜鸟教程小白 发表于 2022-12-12 08:54:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在我的理解中,NSOperation 的长时间运行的任务应该在它的 main 函数中实现,一旦 NSOperation 就会触发它被添加到 NSOperationQueue

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

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

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

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

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

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

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



Best Answer-推荐答案


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

[secondOperation addDependency:firstOperation];

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

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

[operationQueue setMaxConcurrentOperationCount:1];

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

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

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

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

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

关于ios - NSOperation 有多个长任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002606/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap