2016-08-22 70 views
3

用UI更新後臺線程中的數據很困難。我讀噸的文檔,但仍然失去了一些東西......swift3 - 用後臺數據更新ui

func getData(){ 
    DispatchQueue.global(qos: .background).async { 
     let token = GetTokenOperation() 

     token.success = { item in 
      print("Success") 
     } 

     token.failure = {error in 
      print(error.localizedDescription) 
     } 

     NetworkQueue.shared.addOperation(op: token) 

     DispatchQueue.main.async { 
      // qos' default value is ´DispatchQoS.QoSClass.default` 
      self.updateUI() 
     } 
    } 

} 

self.updateUI()「成功」之前執行打印。當我把self.updateUI()放在關閉token.success裏面時,確實崩潰了。

+0

據我所知,Apple不允許從後臺線程更新UI。 – pedrouan

+0

是的,這就是爲什麼我問如何正確地做到這一點。 – BobC

+0

好吧,至少這是Swift3中的一個挑戰。 – pedrouan

回答

6

你試過嗎?

token.success = { item in 
     print("Success") 
     DispatchQueue.main.async { 
      self.updateUI() 
     } 
    } 
+0

如果失敗,也可能想要更新UI。但是OOPer是正確的 - 原始代碼在將令牌添加到網絡隊列後將updateUI添加到隊列中。誰知道哪個會先執行?相反,你可以在所有三個地方添加一個「正在進行中」的UI狀態和updateUI ... – samkass

+0

是的,我試圖把DispatchQueue放入成功關閉中,但我需要先完成token.success func才能使用token(解析,存儲等) – BobC