【问题标题】:How to subclass NSOperation class to make it concurrent in IOS?如何继承 NSOperation 类以使其在 IOS 中并发?
【发布时间】:2015-11-18 15:47:13
【问题描述】:

我想继承 NSOperation 以使其并发,根据 Apple 文档,我必须重写以下方法来实现并发操作:

  1. 开始
  2. 正在执行中
  3. 已完成
  4. 是异步的

但是根据我的测试结果,我可以让 NSOperation 对象在第二个线程中运行,而无需实现“isExecuting”、“isFinished”和“isAsynchronous”方法。我只是编写代码。

[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];

在启动方法中,然后在我执行的主线程中

[myOperation start]

然后操作可以在一秒钟内执行第二个线程而不是主线程。谁能解释一下这个问题

【问题讨论】:

  • 使用NSOperationQueue 运行您的NSOperation。将队列设置为并发(或串行)。
  • NSOperationQueue 总是并发执行操作,同时考虑依赖关系。不能是串行模式
  • @Coinmigh 如果您将最大并发设置为 1,它可以是串行的。
  • @rmaddy,是的,你是对的。通过再次阅读苹果文档,我理解了我提出的问题,谢谢。

标签: ios concurrency nsoperation


【解决方案1】:

您使用的解决方案在今天会被认为很糟糕。

要么您需要 NSOperation 所提供的优势 - 您只是将所有这些都抛到了窗外。祝你好运。或者您不需要需要 NSOperation 的优势,那么请了解 GCD 和 blocks 和 dispatch_async,让您的生活轻松十倍。

【讨论】:

    【解决方案2】:

    同意@gnasher729。如果你只想启动一个异步方法,不要费心使用 NSOperation。 GCD 和块会容易得多。

    回到为什么除了start之外你必须实现isExecutingisFinishedisAsynchronous,这是因为NSOperation在状态、优先级和依赖管理方面做了额外的工作

    例如,您可能希望在离开视图时取消异步操作。 NSOperation 中cancel 方法的默认实现取决于操作的状态。如果操作不在队列中,它将立即完成;如果它在队列中但尚未启动,则其isCancelledisReady 将设置为YES,并等待队列调用其start 方法。 start 方法将检查 isCancelled 属性的值;如果是,它会立即完成。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多