multithreading - 在 segue 之前等待异步方法

标签 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, 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/

相关文章:

ios - Swift 3 - 如何让计时器在后台工作

收集结果的 C# ActionBlock 等价物

javascript - 使用 axios 发布和获取请求的不同 header ,创建?

python - 异步请求退避/节流最佳实践

Java - 每个线程多个可运行对象

python-3.x - threading.Condition 和 threading.Event 之间的区别

android - 从服务器请求数据的最佳方式

ios - 当添加到另一个对象中时,对象中的 Double 转换为字符串

.net - 在什么情况下我应该使用不同的 .NET 线程方法?

ios - Mozharovsky 的 CVCalendar 日期不显示