2016-11-14 61 views
-1

我有一個方法,由於問題的計算負載,有時需要幾秒鐘才能返回結果。請注意,這純粹是一個「離線」問題,該功能不會調用基於Web的API。如何等待方法調用的正確結果?

當前,無論何時我要求返回該方法,它只返回nil,因爲它仍然在另一個線程上的函數上工作。

我該如何編寫一個等待函數的正確非零響應的函數?

+3

不要等待。計算功能完成時通知。 – vadian

+0

@vadian。你能展示任何例子嗎?這肯定會讓問題進一步上行,但這同樣是問題嗎? –

+0

這是同樣的問題,但不像輪詢(等待)它不會浪費任何資源。 – vadian

回答

0

您應該使用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 
} 
+0

是的,這看起來很有希望,但問題在於耗時函數的結果也是視圖的主要特徵,所以在這個問題得到解決之前不會發生太多事情。我可以使用完成處理程序在主線程上查找結果嗎? –

+0

@JamesStonehill如果你想在回調中獲得計算結果,請檢查更新版本。 – alexburtnik