为什么我的 NSOperation 没有取消?

Sta*_*wer 6 nsoperation swift

我有这段代码可以将一个NSOperation实例添加到队列中

let operation = NSBlockOperation()
operation.addExecutionBlock({
    self.asyncMethod() { (result, error) in
        if operation.cancelled {
            return
        }

        // etc
    }
})
operationQueue.addOperation(operation)
Run Code Online (Sandbox Code Playgroud)

当用户离开触发上述代码的视图时,我取消操作

operationQueue.cancelAllOperations()
Run Code Online (Sandbox Code Playgroud)

在测试取消时,我 100% 确定取消在异步方法返回之前正在执行,所以我希望operation.cancelled是真的。不幸的是,这并没有发生,我不明白为什么

我正在执行取消 viewWillDisappear

编辑

asyncMethod包含在不同线程中运行的网络操作。这就是回调存在的原因:处理网络操作返回。网络操作在类层次结构的深处执行,但我想在根级别处理 NSOperations。

use*_*734 6

调用此对象的取消方法将此属性的值设置为 YES。一旦取消,操作必须移动到完成状态。

取消操作不会主动停止接收者的代码执行。操作对象负责定期调用此方法,如果该方法返回 YES,则停止自身。

在为完成操作的任务而做任何工作之前,您应该始终检查此属性的值,这通常意味着在自定义 main 方法的开头检查它。可以在操作开始执行之前或执行期间的任何时间取消操作。因此,检查主方法开始时的值(并在整个方法中定期检查)可以让您在取消操作时尽快退出。

import Foundation

let operation1 = NSBlockOperation()
let operation2 = NSBlockOperation()
let queue = NSOperationQueue()
operation1.addExecutionBlock { () -> Void in
    repeat {
        usleep(10000)
        print(".", terminator: "")
    } while !operation1.cancelled
}
operation2.addExecutionBlock { () -> Void in
    repeat {
        usleep(15000)
        print("-", terminator: "")
    } while !operation2.cancelled
}
queue.addOperation(operation1)
queue.addOperation(operation2)
sleep(1)
queue.cancelAllOperations()
Run Code Online (Sandbox Code Playgroud)

在操场上试试这个简单的例子。

如果运行另一个异步代码真的很重要,试试这个

operation.addExecutionBlock({
if operation.cancelled {
            return
        }    
self.asyncMethod() { (result, error) in


        // etc
    }
})
Run Code Online (Sandbox Code Playgroud)