Swift Completion Handler调用语法

时间:2016-03-08 18:57:42

标签: swift block completionhandler

我有一个庞大且耗时的例程(calculatePower)需要一个完成处理程序,以便它同步运行。请求的触发器是UIButton。它被称为:

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    calculatePower() {
        completionHandler(UIBackgroundFetchResult.NewData)
       }
}

calcualtePower中完成处理程序的重要位读作:

func calculatePower(completionHandler: (() -> Void)!) {
   completionHandler()
}

我是否做到了这一点,如果是这样,我会调用application()?

application() 

ain&#ttttt。

2 个答案:

答案 0 :(得分:1)

dispatch_async不是你打电话的东西。如果您配置了后台下载,那么运行时会调用它。你的情况似乎与后台下载没有任何关系(是吗?)所以我会说你完全咆哮了错误的树。如果您想将耗时的计算卸载到后台,您需要了解GCD和后台队列(即dispatch_async)。之后您可以轻松地返回主线程(使用另一个{{1}})。

答案 1 :(得分:0)

解决方案读起来,非常感谢Matt。

@IBAction func buttonCalculatePower(sender: AnyObject) {
    self.calculateButton.setTitle("Calculating", forState: .Normal)
    self.calculateButton.backgroundColor = UIColor.lightGrayColor()
    self.calculateButton.enabled = false
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            self.calculatePower()
            dispatch_async(dispatch_get_main_queue()) {
                self.calculateButton.backgroundColor = UIColor.orangeColor()
                self.calculateButton.setTitle("Start", forState: .Normal)
                self.calculateButton.enabled = true
        }
    }
}