基本上,我只在應用程序中使用了一個moc,但我認爲我應該在某些情況下使用多個NSManagedObjectContext。何時以及爲什麼要使用多個NSManagedObjectContext?
- 當我應該使用多個NSManagedObjectContext?
- 我聽說我應該在某些情況下使用3 moc,但我不知道哪些情況下我應該使用3 moc?
基本上,我只在應用程序中使用了一個moc,但我認爲我應該在某些情況下使用多個NSManagedObjectContext。何時以及爲什麼要使用多個NSManagedObjectContext?
通常情況下,要使用一個單獨的NSManagedObjectContext
爲將要訪問核心數據DB每個線程。這是爲了防止由於併發寫入同一上下文而導致對象圖形潛在地陷入不一致狀態。
處理此問題的最簡單方法是爲每個線程創建一個新的NSManagedObjectContext
並共享一個NSPersistentStoreCoordinator
。
創建您NSManagedObjectContext
類型的AppDelegate的屬性,並重寫的getter返回一個新的環境對每個調用線程。通過利用每個線程的threadDictionary
來做到這一點。
首先,設置你的managedObjectModel和persistentStoreCoordinator像平時那樣。然後在你的AppDelegate創建您的上下文並分配給你的財產:
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;
在你managedObjectContext吸氣覆蓋,使用下面的代碼返回一個單獨的上下文爲每個調用線程:
- (NSManagedObjectContext *) managedObjectContext
{
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
//For the Main thread just return default context iVar
return _managedObjectContext;
}
else
{
//Return separate MOC for each new thread
NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
[threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];
}
return threadManagedObjectContext;
}
}
現在任何地方你的代碼訪問AppDelegate的managedObjectContext屬性,你一定會是線程安全的。
對於每個NSThread,唯一維護「MOC_KEY」的最佳方法是什麼? –
下面的鏈接清楚地解釋何時,爲何以及如何使用多個管理對象上下文。
以下是使用多個管理對象方面主要有兩個原因。
NSManagedObjectContext
線程安全,因爲NSManagedObjectContext
不是線程安全的。NSManagedObjectContext
以在UI上顯示數據。這意味着,當您在UI上顯示數據並從服務器獲取數據時,我們應該獲取子數據庫NSManagedObjectContext
上的數據以避免併發性和UI堵塞問題。
我能想到的唯一理由是,如果你有不同的數據集,你可能想單獨訪問。 – Kevin