2017-06-13 102 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 
}