在继续之前等待异步块[重复]

问题描述 投票:0回答:2

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

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

func a() -> String {

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

    x = "test"
    }
    return x
}
swift swift3
2个回答
13
投票

就像每个人指出的那样,您可以使用完成处理程序(

closure
)来执行操作。但您也可以使用
DispatchSemaphore
等待异步调用完成。信号量在进行
wait
调用时获得锁,并在收到异步块的信号时释放锁。

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

2
投票

您可以为此使用完成闭包

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

//这样调用(返回完成块时就会执行value

a { (value) in
     print(value)
  }
© www.soinside.com 2019 - 2024. All rights reserved.