如何取消完成处理程序?

时间:2015-11-07 00:04:09

标签: swift completionhandler

我想增强以下代码:当我点击“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)
}

你能告诉我怎么做吗?

1 个答案:

答案 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子类的开销。如果您要取消已支持取消逻辑的内容(例如NSURLSessionCLGeocoder等),则无需执行此项工作。但是,如果您真的想要取消自己的算法,那么NSOperation子类可以非常优雅地处理它。