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()
    })
}