2013-04-24 43 views
0

我瘋了試圖弄清楚這一點。我正在研究一個正在同步Web服務器數據的應用程序。有一個後臺線程將數據從服務器拉到應用程序。與此同時,我正在對UI進行更改。 UI上更改的值將保存到前臺的核心數據中。核心數據單個託管對象上下文和兩個線程

通過應用程序,我有一個managedObjectContext,每次創建fetchController時都會從應用程序委託中獲取。應用代理代碼

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     __managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 

現在問題是我在嘗試保存上下文時出錯。錯誤在代碼中隨機發生。只要我對任何實體進行更改,我都會保存上下文。另外我在每個實體中都有兩個關係到它的孩子,這個關係是一對多和一對父母的關係 - 一個關係。所有的關係都有適當的反向

我想我在做一些概念錯誤在這裏通過修飾一個上下文。您能否請在後臺和前臺線程正在讀取和寫入coredata的情況下,建議如何管理上下文。謝謝。

+0

您正在使用線程約束來初始化您的MOC,因此您只能在創建它的線程上使用它...最有可能是主線程。沒有什麼內在的錯誤......但是你如何爲你的後臺存儲創建MOC?如果您使用的是與您的問題相同的MOC。閱讀有關Core Data的併發性文檔。 – 2013-04-24 15:37:16

回答

0

受管對象上下文不是線程安全的,所以如果你在多個線程中使用同一個線程而不考慮併發性 - 你會遇到大問題。如在,崩潰和/或數據丟失,甚至可能是數據損壞。有一對夫婦的方式來解決這個問題:創建context--看到文檔的initWithConcurrencyType:當隊列併發類型的

  1. 用途之一。然後,無論何時訪問數據存儲,請使用performBlock:performBlockAndWait:來同步訪問。

  2. 爲後臺線程創建一個新的託管對象上下文。使用NSManagedObjectContextDidSaveNotificationmergeChangesFromContextDidSaveNotification:來保持多個上下文同步。

但是,不管你做什麼,都只使用一個管理對象範圍內的多個線程。

相關問題