我想增强以下代码:当我点击“submitData”按钮时,添加的代码应该取消完成处理程序。
func returnUserData(completion:(result:String)->Void){
for index in 1...10000 {
print("\(index) times 5 is \(index * 5)")
}
completion(result: "END");
}
func test(){
self.returnUserData({(result)->() in
print("OK")
})
}
@IBAction func submintData(sender: AnyObject) {
self.performSegueWithIdentifier("TestView", sender: self)
}
你能告诉我怎么做吗?
答案 0 :(得分:1)
您可以使用NSOperation
子类。将计算放在main
方法中,但要定期检查cancelled
,如果是,请退出计算。
例如:
class TimeConsumingOperation : NSOperation {
var completion: (String) -> ()
init(completion: (String) -> ()) {
self.completion = completion
super.init()
}
override func main() {
for index in 1...100_000 {
print("\(index) times 5 is \(index * 5)")
if cancelled { break }
}
if cancelled {
completion("cancelled")
} else {
completion("finished successfully")
}
}
}
然后您可以将操作添加到操作队列:
let queue = NSOperationQueue()
let operation = TimeConsumingOperation { (result) -> () in
print(result)
}
queue.addOperation(operation)
并且,您可以随时取消:
operation.cancel()
诚然,这是一个相当人为的例子,但它显示了如何取消耗时的计算。
许多异步模式都有内置的取消逻辑,无需NSOperation
子类的开销。如果您要取消已支持取消逻辑的内容(例如NSURLSession
,CLGeocoder
等),则无需执行此项工作。但是,如果您真的想要取消自己的算法,那么NSOperation
子类可以非常优雅地处理它。