【问题标题】:Exactly when NSOperation is removed from NSOperationQueue on cancelling request?究竟何时在取消请求时从 NSOperationQueue 中删除 NSOperation?
【发布时间】:2014-11-11 01:59:31
【问题描述】:

我正在浏览一些解释如何在 NSOperationQueue 中管理 NSOperation 的文档。如果用户在进度面板中按下取消按钮或退出应用程序,我的重点是始终不执行操作。因此,取消操作以防止它不必要地消耗 CPU 时间。

所以,每当我需要取消操作时,我应该触发 cancel 方法以防止进一步执行。然后我将不得不定期使用操作对象状态 isCancelled 来检查操作是否被取消。以下是我对此的疑问:

(1) 在取消请求时,如果 NSOperation 正在从 NSOperationQueue 中删除,那么我们如何仍然引用该 NSOperation 及其属性 isCancelled

根据 Apple Developer Class Reference:

NSOperationQueue 类规范一组 NSOperation 对象的执行。被添加到队列后,操作将保留在该队列中,直到它被显式取消或完成其任务的执行。

(2) 如果我使用 ARC,我是否需要关心取消请求?我举个例子。我有 2 个视图控制器 A 和 B。在 B 中,我使用 NSOperation 进行 8 到 10 个 NSURLRequest 并将所有请求放入 NSOperationQueue。这里 NSOperationQueue 的对象是视图控制器 B 的属性。因此,如果用户按下后退按钮返回视图 A,在 ARC 下,NSOperationQueue 的对象应该自动删除(当我弹出视图 A 时)。 ARC机制会取消所有操作,还是我应该有一些机制来避免无用的执行?

【问题讨论】:

    标签: ios objective-c automatic-ref-counting nsoperation nsoperationqueue


    【解决方案1】:

    首先,只有当isFinished 属性为真时,操作才会从队列中移除。

    其次,如果你释放 B,那么队列将被释放,操作也会被释放。但是你应该确保在你的代码中你没有在以后引用这些操作对象或队列。

    【讨论】:

    • isCancelled 方法如果通过调用接收者的取消方法显式取消操作,则返回 YES。因此,如果我取消请求,它的状态将变为 isFinished TRUE。那么我的问题编号(1)仍然存在......
    • So, if I cancel the request, its state goes to isFinished TRUE,你从哪里得到的?这仅适用于非排队操作。请在此处查看developer.apple.com/library/mac/documentation/Cocoa/Reference/… 查看Responding to the Cancel Command 部分。上面的表格也显示了 KeyPath 和描述。它明确指出an operation queue does not dequeue an operation until the isFinished method returns YES
    • 对不起,croyneaus4u,我错了。该语句只能应用于非排队操作。现在,我的问题 1 已清除。非常感谢 royneaus4u。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多