2016-07-26 61 views
0

我對iOS目標C中的多線程有疑問。我從來沒有在線程上工作過。 在我的應用程序中,我有幾個任務只需要在後臺運行,用戶界面不會被凍結。 以下是代碼片段,iOS目標中的多線程C

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
      [self someFunctionCallinWebservice]; 
      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //UI Updates 
      }); 
     }); 

在上面的代碼,功能:someFunctionCallinWebservice呼籲裏面我是用AFNetworking庫web服務。在web服務,如果它是成功的,那麼我在本地保存數據。我打電話的成功塊的功能,以節省從服務器發送類似下面的數據,

[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject){ 
[self functionToSaveData:someArray]; 
} 

這裏someFunctionCallinWebservice在後臺運行,但在前臺[self functionToSaveData:someArray]運行。我是否應該在後臺線程中使用這個functionToSaveData?

我的意思是如果我在後臺調用函數,那麼函數的所有相關功能,如調用服務器,獲取數據並保存它也必須落在後臺線程中。爲什麼我應該再次創建另一個線程?

請幫助...

+0

它可以在後臺運行,直到你需要以任何方式與UI類進行交互。因此,在後臺獲取並保存,然後在完成時推動UI進行更新。 – Droppy

回答

2

是,U可以調用背景線程functionToSaveData功能它不會產生任何問題,但如果u想要做的任何UI更新(如: - >重裝的tableView,顯示或隱藏一些意見),那時你必須在主線程上做,否則它不會對你的UI產生任何影響。

dispatch_async(dispatch_get_main_queue()) { 
     //Do any UI updates here  
     } 
1

多線程是一個大而困難的主題,iOS有不同類型的支持。我建議你先閱讀蘋果的Threading Programming Guide

對於您似乎正在執行的操作(從互聯網獲取數據)的類型,我建議您使用iOS異步API,例如URLSession,這樣可以免去您自己對多線程進行任何操作的需要。

具體問題的答案取決於您的POST:parameters:success:操作是同步操作還是異步操作,並且取決於functionToSaveData:實際執行的操作。 假設functionToSaveData:旨在與您的應用程序的其餘部分共享數據,最好在主線程上執行此操作,以避免同步問題。