在继续之前等待异步块

时间:2017-06-13 03:54:37

标签: swift swift3

我有一个函数让我们称之为“a”运行一些代码然后返回一个字符串“x”在异步代码块中更新然后返回。

在异步代码运行之后,如何让程序等待返回x?

func a() -> String {

    //code
    //code
    var x: String
    async block {

    x = "test"
    }
    return x
}

2 个答案:

答案 0 :(得分:6)

像所有人都指出的那样,您可以使用完成处理程序(closure)来执行操作。但您也可以使用DispatchSemaphore等待异步调用完成。信号量在进行wait调用时获得锁定,并在从异步数据块发出信号时被释放。

func a()->String{
    var x = ""
    let semaphore = DispatchSemaphore(value: 0)
    DispatchQueue.main.async {
        x = "test"
        semaphore.signal()
    }
    semaphore.wait()
    return x
}

答案 1 :(得分:1)

您可以使用完成闭包

func a(completion: @escaping (_ value:String)->()) {
    var x: String = ""
    async block {
      x = "test"
      completion(x) //when x has new value
    }
}

//像这样调用(返回完成块时将执行值

a { (value) in
     print(value)
  }