2016-12-15 139 views
0

我想我瞭解了以下工作但希望確認。IOS/Objective-C的:返回到主線程

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
} 
dispatch_async(dispatch_get_main_queue(), ^{ 
    //display new data on main thread. 
} 

我的問題是,我可以想當然的主線程上的顯示將不會發生,直到在後臺發生的一切結束後 - 無論多久?

我希望得到確認的原因是偶爾我會觀察顯示器的一些問題。當後臺線程沒有完成保存時,要確保顯示不會嘗試訪問核心數據。

+0

這是正確的。但你是什麼意思與「顯示器是不是......「?如何才能‘顯示’做任何事情。 –

+0

的調用'[NSData的dataWithContentsOfURL]'可能會做從網絡的網絡請求,具體情況取決於。URL指向如果它是一個文件URL指向本地文件系統上的文件,它會簡單地從本地文件讀取數據。如果它像'HTTP遠程URL://富/ bar.jpg'那麼它將同步地從遠程服務器獲取數據 –

回答

2

您的代碼不正確。在從URL中檢索數據之前,您正試圖更新UI。

您需要:

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //display new data on main thread. 
    } 
} 

此代碼還假定fetchData:是不是異步的,意味着它不會返回,直到數據已被提取和更新。

+0

因此,如果提供的是dispatch_asynch中的主隊列,它將等待讀取數據完成? – Arjun

+0

是的,它與其他方法調用沒有區別但正如我所說的,這隻有在fetchData:'的實現沒有返回,直到數據被提取並存儲在覈心數據中時纔會起作用,如果它的實現是異步的,那麼'fetchData:'將返回太快,解決方案將會添加一個完成處理程序到'fetchData'。 – rmaddy

+0

我感覺你不明白異步函數調用是如何工作的。異步函數在任務完成之前立即返回。 –