我有一个按钮,当我按下它时,我调用了一个异步函数:
func check(url : String){
let url = NSURL(string: url)
print("Checking")
dispatch_async(dispatch_get_main_queue(), {
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if error == nil {
self.isWorking = true
}
else{
self.isWorking = false
}
}
}
task.resume()
})
}
所以当我按下我的按钮时,我会执行以下操作:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){
let web = segue.destinationViewController as! ViewController()
check(url)
dispatch_async(dispatch_get_main_queue(), {
if (isWorking){
// Do stuff
}
})
}
问题是 isWorking 在检查方法完成之前被调用。
在检查 isWorking 之前如何确保检查已完成?
最佳答案
您可以使用“完成处理程序”:
func check(url : String, completion: (isWorking: Bool)->()) {
let url = NSURL(string: url)
print("Checking")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if error == nil {
completion(isWorking: true)
}
else{
completion(isWorking: false)
}
}
task.resume()
}
你可以这样调用它,并带有尾随闭包:
check(url) { (isWorking) in
if isWorking {
// do stuff
} else {
// not working
}
}
关于multithreading - 在 segue 之前等待异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314299/