Multithreading 在segue之前等待async方法
我有一个按钮,当我按下它时,我调用一个异步函数:Multithreading 在segue之前等待async方法,multithreading,swift,asynchronous,request,Multithreading,Swift,Asynchronous,Request,我有一个按钮,当我按下它时,我调用一个异步函数: func check(url : String){ let url = NSURL(string: url) print("Checking") dispatch_async(dispatch_get_main_queue(), { let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, re
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
}
})
}
问题是在check方法完成之前调用了isWorking
在检查是否正常工作之前,如何确保检查已完成?这将完成以下工作:
import UIKit
class AnyViewController: UIViewController
{
var isWorking = false
func check(url : String)
{
let url = NSURL(string: url)
print("Checking")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if error == nil
{
self.performSegueWithIdentifier("mySegueID", sender: nil)
}
else{
self.isWorking = false
}
}
task.resume()
}
}
您可以使用“完成处理程序”:
你这样称呼它,带有一个尾随的闭包:
check(url) { (isWorking) in
if isWorking {
// do stuff
} else {
// not working
}
}
只有当任务使用NSNotificationCenter.defaultCenter()完成时,您才能向侦听器发布通知以执行此步骤。postNotificationName(“名称”,对象:nil):
这样,customSegue func中的代码将仅在错误==nil时执行是否要在http调用后立即执行segue?如果是这样,您可以在http调用之后添加回调。
check(url) { (isWorking) in
if isWorking {
// do stuff
} else {
// not working
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Register a notification listener
NSNotificationCenter.defaultCenter().addObserver(self, selector: "customSegue:", name:"segue", object: nil)
}
func customSegue(notification: NSNotification){
// Do stuff
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){
check(url)
}
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
// Send a notification to the listener to perform stuff
NSNotificationCenter.defaultCenter().postNotificationName("segue", object: nil)
}
else{
self.isWorking = false
}
}
}
task.resume()
})
}