0

我正在開發一個應用程序,其中與後端同步不應該阻止用戶界面。 因此,我確實使用許多MOC和那些通過其performBlock方法(將自動在後臺線程中完成)操作下載和導入的MOC。不同的線程中的ManagedObjectContexts - 不同的對象引用

我的背景MOCS創建爲主要MOC的孩子:

context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[context setParentContext:aConfiguration.context]; 
coordinator = aConfiguration.coordinator; 
model = aConfiguration.model; 
store = aConfiguration.store; 
errorHandler = aConfiguration.errorHandler; 

所以大部分工作正常,到目前爲止,但有一個顯著的問題。 我下載文本和圖像數據。因此,在用戶界面中,我想首先顯示文本,然後對於每個下載的圖像,淡入此下載的圖像。 通常沒有問題,下載完成圖像下載,並調用其委託(服務)ALA

downloder:(id<Downloader) aDownloader didFinishDownloadImageItem: (id) aObjectWithImage 

而aObjectWithImage與新下載的圖片我的模型對象。

代表將投放對象的通知,並張貼此通知

NSDictionary *userInfo = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObject:aObjectWithImage] 
                 forKeys:[NSArray arrayWithObject:EntityWithImageDownloadedNotificationInfoKeyEntity]];  
[[NSNotificationCenter defaultCenter] EntityWithImageDownloadedNotification object:self userInfo:userInfo]; 

這裏開始的問題。假設我的UIViewController會觀察這些通知。收到一個後,他會搜索他的對象數組,以顯示信息字典中的一個來更改圖像。

你看到問題了嗎?他永遠不會找到這個東西!由於這個事實,最初這個對象是在後臺線程中創建的,因此是另一個MOC,UIViewController的對象數組(主MOC)中的對象引用總是與通知(後臺MOC)發佈的對象引用不同。

我知道如何解決這個問題,發佈通知的委託可以在其MOC(這是主要的)上搜索對象,但我有點不喜歡這個想法。我認爲這沒有錯,因爲服務也創建了後臺線程,所以它知道在委託方法中接收的所有對象都在後臺線程的MOC中。

一些建議如何我可以更好地處理這個問題?
我真的很感謝你的任何想法!

回答

0

你使用的是什麼併發類型?我猜你NSPrivateQueueConcurrencyType爲你的背景MOC,從你在說什麼關於使用performBlock:來包裝你的查詢。您的主線MOC是否使用NSMainQueueConcurrencyType

我認爲你想做類似於this answer中描述的內容。在你的後臺MOC塊中,告訴你的主MOC執行一個塊,並通過它的對象ID傳遞被管理的對象。

您可能會問,主線程MOC中新的託管對象是如何存在的?簡單:您將背景MOC作爲主線程MOC的子項。當您在後臺MOC上調用保存時,它會將其新對象推入其父主MOC中,這是您的主對象。在你傳遞對象ID之前做這件事,你的對象將在那裏。

+0

這就是我正在做的atm(請參閱我的編輯)。我的主要MOC是NSMainQueueConcurrencyType,而我所有的後臺moc都是主要MOC的孩子。 插入和erverything其他工作正常,但對象引用是不同的,因爲對象是在子上下文中創建的,所以父上下文確實有其他引用緩存到我的託管對象 – Alexander 2012-03-23 10:32:55

0

通過引用我假設你的意思是objectID。在將對象保存到子上下文之前調用[moc ObtainPermanentIDsForObjects:error:]。然後執行保存,而不是使用臨時ID保持它應該有您的主要上下文將獲取永久ID。

我讀了一些地方,它不會打擾獲取永久ID,而是別名臨時ID。考慮這個錯誤或功能。

相關問題