【问题标题】:When does the NSOperationQueue remove an operation from the queue?NSOperationQueue 何时从队列中删除操作?
【发布时间】:2014-02-26 13:55:56
【问题描述】:

我需要知道NSOperationQueue 何时从队列中删除操作? 我有NSOperationQueue,其中有NSOperation 的列表。 NSOperationQueue 何时从队列中删除操作?

  1. 开始操作后?或
  2. 完成/取消操作后?

因为当NSOPerationqueue 中的所有操作完成时我需要通知。为此我推荐了this link

【问题讨论】:

  • 完成或取消后
  • 操作队列中操作完成阻塞或失败检查计数(发送通知或使用委托)

标签: ios nsoperation nsoperationqueue


【解决方案1】:

根据 Apple Developer Reference

一个操作队列执行其排队的 NSOperation 对象基于 他们的优先级和准备情况。加入操作队列后, 一个操作一直在它的队列中,直到它报告它完成 与它的任务。

所以,NSOperationQueue 在操作完成后删除它。

来源 - https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

【讨论】:

  • 请注意,如果一个操作被取消,它只是在操作中设置适当的标志来标记它 - 操作本身负责检查它是否被取消并相应地标记自己完成。一个尚未开始的操作应该在它开始时检查它是否被取消,并在标记自己完成后立即返回。正在执行的操作需要定期检查它是否被取消并以类似的方式处理。见developer.apple.com/reference/foundation/nsoperation/…
  • @Austin 评论应该是它自己的独立答案。这一点非常重要并且有助于注意取消并不意味着立即从队列中删除。
【解决方案2】:

NSOperationQueue 管理其内部队列NSOperations。 NSOperation 只有在取消或完成后才会从队列中移除。

请注意,如果NSOperation 被取消,它只是在NSOperation 对象中设置适当的标志来标记它 - NSOperation 的实现负责检查它是否被取消并将自己标记为完成因此。尚未开始的操作应该在开始时检查它是否被取消,并在标记自己完成后立即返回。正在执行的长时间运行的操作需要定期检查它是否被取消并以类似的方式处理该状态。

在执行破坏性代码或会改变数据的代码之前执行此检查也很有意义,例如从核心数据中保存或删除托管对象。

https://developer.apple.com/reference/foundation/nsoperation/1411672-cancel?language=objc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2012-12-17
    相关资源
    最近更新 更多