問題陳述
我有麻煩保存服務器端數據異步。IOS核心數據異步節約
結構
我使用的NSManagedObjectContext以下結構的父母爲了孩子:
- writerManagedObjectContext(NSPrivateQueueConcurrencyType)
- masterManagedObjectContext(NSMainQueueConcurrencyType)
- backgroundManagedObjectContext(NSPrivateQueueConcurrencyType)
我使用下面的代碼保存數據
[backgroundManagedObjectContext performBlock:^{
[backgroundManagedObjectContext save:nil];
[masterManagedObjectContext performBlock:^{ // Starts blocking UI from here
[masterManagedObjectContext save:nil];
[writerManagedObjectContext performBlock:^{
[writerManagedObjectContext save:nil];
}]
}]
}]
問題
代碼節省精碼。 backgroundManagedObjectContext
也異步保存。但是,masterManagedObjectContext
和writerManagedObjectContext
都拒絕異步保存並阻止UI線程。 (我知道它會阻止UI線程,因爲我嘗試執行裏面什麼都沒有做與核心數據的行爲,他們也被封鎖,這不是不是持續協調訪問的情況下)
問題
- 上述代碼阻塞主線程的原因是什麼?
- 我是否正確假設我可以從任何地方調用上述代碼,因爲
save
將在每個相應的線程/上下文中調用?
任何幫助將不勝感激。
編輯
http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/
顯然凍結來源於試圖傳播到父的NSManagedObjectContext。這篇文章似乎避免了這樣一個事實,即不可能對主要上下文進行真正的異步保存。
數據被嚴重鏈接,5MB,大約需要40s才能保存到psc。我不認爲我會使用後面描述的並行結構,因爲代碼庫已經很大。我將不勝感激任何可以用來減少這種凍結的策略。
我已經在使用結構所示的嵌套MOC。我的問題是爲什麼儘管使用嵌套的MOC結構保存不是異步的。 – jrhee17
我意識到你在重新閱讀你的文章後使用了嵌套的上下文。我會編輯我的答案。您應該避免將'nil'傳遞給'save'錯誤處理程序。你會希望能夠對錯誤做出反應。嘗試檢查錯誤,看看是否拖延你的主隊列。你也提到'服務器端'。您正在使用Core Data iCloud同步嗎? – jp2g
我使用自己的服務器,但老實說服務器是無關的。基本上我解析json數據並將它們插入到Core Data中。我在做錯誤處理 - 上面的代碼只是爲了說明我的代碼是什麼樣的。 – jrhee17