我有一個方法,由於問題的計算負載,有時需要幾秒鐘才能返回結果。請注意,這純粹是一個「離線」問題,該功能不會調用基於Web的API。如何等待方法調用的正確結果?
當前,無論何時我要求返回該方法,它只返回nil,因爲它仍然在另一個線程上的函數上工作。
我該如何編寫一個等待函數的正確非零響應的函數?
我有一個方法,由於問題的計算負載,有時需要幾秒鐘才能返回結果。請注意,這純粹是一個「離線」問題,該功能不會調用基於Web的API。如何等待方法調用的正確結果?
當前,無論何時我要求返回該方法,它只返回nil,因爲它仍然在另一個線程上的函數上工作。
我該如何編寫一個等待函數的正確非零響應的函數?
您應該使用GCD將耗時的塊分配給後臺線程。這裏最主要的是不要用困難的任務阻止主線程。
斯威夫特3例子:
func doSomethingTimeConsuming(completion: ((Any)->Void)?) {
DispatchQueue.global(qos: .background).async {
//do time consuming task in here (background thread)
//let result = ...
DispatchQueue.main.async {
//use callback here (main thread)
//let's assume the result of your calculation is some object or struct
completion?(result)
}
}
}
替換Any
你從你的函數期望實際結果類型。
用法:
doSomethingTimeConsuming { result in
//this closure will be called when your time consuming function completes execution
}
是的,這看起來很有希望,但問題在於耗時函數的結果也是視圖的主要特徵,所以在這個問題得到解決之前不會發生太多事情。我可以使用完成處理程序在主線程上查找結果嗎? –
@JamesStonehill如果你想在回調中獲得計算結果,請檢查更新版本。 – alexburtnik
不要等待。計算功能完成時通知。 – vadian
@vadian。你能展示任何例子嗎?這肯定會讓問題進一步上行,但這同樣是問題嗎? –
這是同樣的問題,但不像輪詢(等待)它不會浪費任何資源。 – vadian