2017-06-13 104 views
0

之前,我有一个功能可称之为“一”,运行一些代码,然后返回一个字符串“X”在异步代码块被更新,然后返回。等待异步块继续

我怎么会去使程序等待返回X直到异步代码运行后?

func a() -> String { 

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

    x = "test" 
    } 
    return x 
} 
+0

通过使用闭包将异步块更改为“sync” – pkc456

+0

。 –

+1

你必须问自己的问题是,为什么要异步调度一些代码(应该立即返回),然后阻止调用者执行,直到结果可用。你必须重新安排你的代码,不要浪费你的时间重新发明轮子... – user3441734

回答

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

像其他人指出,你可以使用完成处理程序(closure)进行操作。但你也可以等待使用DispatchSemaphore完成异步调用。信号灯当调用wait调用时会获得一个锁,并且在从异步块发送信号时它会被释放。

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