2013-05-03 56 views
1

據UIManagedDocument的文檔中簡單地提到,UIManagedDocument,後臺線程和

支持異步數據寫入父上下文,核心數據實際使用一對嵌套的管理對象上下文。

這是特定於UIManagedDocument或核心數據總是這樣做嗎?

同一份文件還指出,

如果合適的話,你可以從後臺線程直接加載數據到上下文。

這是否意味着,在下面的代碼

NSManagedObjectContext *moc = self.managedObjectContext; 
[moc performBlock:^() { 
    Record *record = [NSEntityDescription 
     insertNewObjectForEntityForName:@"Record" 
       inManagedObjectContext:moc]; 
}]; 

我應該簡單地替換第一線由

NSManagedObjectContext *moc = self.managedObjectContext.parentContext; 

來實現這一目標?

我想我也很困惑它會直接使用這個父上下文是「合適的」。我的意思是,這聽起來像performBlock是用來卸載任務到後臺隊列。爲什麼我需要混淆父上下文?

如果有人爲我澄清這一切,我將不勝感激。

回答

5

這是UIManagedDocument的實現細節,但是這是Core Data應用程序中的常見設計模式。 UIManagedDocumentmanagedObjectContext是併發類型爲NSMainQueueConcurrencyType的上下文,而parentContext是併發類型爲NSPrivateQueueConcurrencyType的上下文。

有關併發類型的更多信息,請參閱here。簡而言之,父上下文使用後臺隊列進行操作,而子進程使用主隊列。

通常,當您希望以非阻塞方式在後臺隊列中執行某些操作時,您希望直接使用父上下文。例如,如果您希望執行漫長而困難的提取請求,則可以直接在父上下文中執行它。請記住,返回的對象在上下文之間不可互換,因此您必須將返回的對象從一個上下文重新提取到另一個上下文中(但現在可以使用[NSPredicate predicateWithFormat:@"SELF IN %@", fetchedObjectsFromAnotherContext]輕鬆執行重新提取)。

所以得出結論,這取決於你在操作中做了什麼。主隊列上下文通過不要求使用performBlock:來簡化事情,因爲一切都在主隊列(主線程)上執行。如果你只想插入一個對象,移動到一個專用隊列的好處可以忽略不計,甚至由於操作系統的上下文切換,甚至是有害的。但是,如果要執行此對象插入操作,則需要執行繁重的提升操作,您可以將其卸載到後臺隊列並直接在父上下文中執行。