【问题标题】:How to block an NSOperation until an NSOperationQueue finishes?如何阻止 NSOperation 直到 NSOperationQueue 完成?
【发布时间】:2013-05-10 02:56:33
【问题描述】:

我有一个数据加载操作需要在主线程之外运行以避免潜在的阻塞问题。为此,我使用了 NSOperationQueue 和 NSOperations。

然而,出现的一个问题是,存在一种操作是为了根据传入的信息产生额外的操作。尝试解决这个问题也解决了我在其他地方遇到的一些小问题,因为我遇到的解决方案是给 NSOperation 它自己的子任务队列。

问题是,一旦“main”退出,NSOperation 就会被标记为“finished”,而不管子队列是否完成处理;如何覆盖该行为?

【问题讨论】:

  • 听起来您正在寻找concurrent NSOperation?
  • @CarlVeazey 不...确切地说,但看起来用于创建并发 NSOperation 的步骤与我实际上正在寻找的相同。您必须重写 start 方法处理 isFinished/isExecuting 的方式,我认为这正是我需要在这里做的。我需要覆盖 start 所以它不会设置 isFinished 即时主要结束。这意味着当我更改这些属性时处理 KVO 的东西,哦,高兴。
  • @CodaFi 我不确定我是否说清楚了,但是您建议的答案似乎没有意义。依赖关系阻止操作执行,它们不会阻止它在开始执行后完成。至少,参考文献似乎是这么说的。
  • 啊,我的错。那为什么setSuspended: 不适合你呢?在处理像 NSOperationQueues 这样的堆栈式对象时,拥有“子队列”是没有意义的。具有不同并发规范的两个队列更有意义
  • 是的,我的意思是,您通过制作动态 二维操作数组使您的生活变得复杂!听起来您的解决方案足够独特,以至于您需要将其重构为更简单的解决方案(考虑 NSObject 是如何做事的:“快速”方式和基于锁的“慢速”方式,类似于您的依赖队列问题),或者自己写。我不相信这太难了,因为 NSOperationQueue 最近才包装 GCD。 NSOperation 的状态机不是为依赖或扩展而设计的——在你的情况下这是一个相当不幸的缺点。

标签: ios objective-c concurrency nsoperation nsoperationqueue


【解决方案1】:

您可以在退出操作主方法之前向您的子队列发送waitUntilAllOperationsAreFinished 消息。这很容易,但不是一个好主意,因为它阻塞了整个线程,相当浪费。

更好的解决方案是使用依赖系统。创建另一个依赖于您的主操作的操作。创建子操作后,还将它们作为依赖项添加到新的“完成”操作中。

【讨论】:

    【解决方案2】:

    “main”一退出,NSOperation 就会被标记为“finished”,

    此逻辑在[NSOperation start] 中实现,因此您只需用您的自定义逻辑覆盖它:调用main,这会产生一些额外的操作,在完成后设置状态isFinished 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多