2013-10-29 68 views
1

更新:我想的問題是,當孩子上下文保存不更新父上下文。仍然需要幫助。多上下文CoreData使用線程


我已經嘗試了多上下文(父 - 子)核心數據的許多例子。

此前,我的應用程序使用傳統的存儲數據的方式,即我使用OperationQueue從服務器獲取數據並使用MOC保存到數據庫並保存到mainMOC的mergeChanges通知:NSManagedObjectContextDidSaveNotification 。

而不干擾該應用的流動,(即除去OperationQueue),我試圖執行親子ManagedObjectContext關係,其中我用concurrencyType一個privateMOC爲NSPrivateQueueConcurrencyType具有persistantStoreCoordinator,並與concurrenyType的mainMOC如NSMainQueueConcurrencyType這是私人機構的孩子。並且在隊列中,我有一個tempMOC,其中concurrencyType爲NSPrivateQueueConcurrencyType,它是mainMOC的子項。

同時節約,我窩三個MOCS的performBlock爲 -

[tempMOC performBlock:^{ 
     if (![tempMOC save:&error]) { 
      NSLog(@"Error : %@",error); 
     } 
     [mainMOC performBlock:^{ 
      if (![mainMOC save:&error]) { 
       NSLog(@"Error : %@",error); 
      } 
      [privateMOC performBlock:^{ 
       if (![privateMOC save:&error]) { 
        NSLog(@"Error : %@",error); 
       } 
      }]; 
     }]; 
    }]; 

我得到這樣的錯誤CoreData 1560和1570,而mainMOC試圖保存。 NSValidationErrorKey錯誤,它說有些值是nil。 是否tempMOC的變化不會去mainMOC?我沒有挖掘,但據我所知,它不應該是零。 什麼可能是錯誤?請幫忙。

更新:我試圖打印tempMOC的對象,我看到這樣正確的價值觀:

<Element_Name: 0xc0b59c0> (entity: Element_Name; id: 0xc07ca90 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8730> ; data: { 
    tag1 = nil; 
    tag2 = 3430065; 
    tag3 = 600; 
    tag4 = N; 
    tag5 = "2013-10-29 00:00:00 +0000"; 
    tag6 = nil; 
    tag7 = 327842701; 
    relation = "0xbf1f760 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/Relation/p1>"; 
    tag8 = "Some_Value"; 

我試圖打印mainMOC的對象,我看到nil價值,而不是像數據:

<Element_Name: 0xbd47a50> (entity: Element_name; id: 0xc0b14b0 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8740> ; data: { 
    tag1 = nil; 
    tag2 = nil; 
    tag3 = 0; 
    tag4 = nil; 
    tag5 = nil; 
    tag6 = nil; 
    tag7 = nil; 
    relation = "0xbd586c0 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/relation/p1>"; 
    tag8 = nil; 

回答

0

vshall,

如果你已經有一個背景插入MOC模式的工作,你爲什麼TR是否應該轉向親​​子關係?它不是更快。而且,從我所看到的關於您的實現的情況來看,您最終會阻止主線程。

有使用親子關係MOC許多很好的理由。其中大多數涉及創建臨時或只讀MOC。第二大用例是讓您的主要MOC成爲私人併發MOC的孩子。這種方式節省了「快速」,並在後臺線程上完成。根據我的經驗,插入到主MOC的兒童併發MOC中的背景較慢,並導致UI出現口吃。

在回答你的問題,你想你的嵌入式一套節省完成之前訪問項目。因此,你的數據被破壞,你會得到例外。

Andrew

+0

當通過notification-NSManagedObjectContextDidSaveNotification更新主MOC時,背景插入MOC掛起UI。 經過一番谷歌搜索之後,我發現父母孩子MOC沒有掛起UX,與傳統的MOC相比 – vshall

+0

我無法確認代碼是否正在嘗試訪問設置,試圖嵌入保存在performBlockAndWait也。 – vshall

+0

vshall,由於您沒有列出您的來源,因此您認爲爲什麼您認爲親子MOC更快並且不掛斷用戶界面,我無法解決您的問題。根據我的經驗,情況並非如此。至於你的情況,我認爲你正試圖在保存之前訪問數據。你也許可以通過延遲閱讀代碼來測試它是如此。安德魯 – adonoho

1

我剛碰到同樣的問題,發現了一個解決方案。沒有你的其他代碼我不能保證這會解決你的問題,但它確實解決了我的問題。

我正在實例化一些NSManagedObject類,修改它們的一些屬性,然後將它們插入臨時或子級NSManagedObjectContext。所有的屬性都顯示得很好,就像你的情況一樣。

但是,當我保存了上下文並且變更被推送到父項NSManagedObjectContext時,所有屬性都無效(就像你的情況一樣)。

當我僅使用一個NSManagedObjectContext時,我還沒有觀察到這種行爲,而且我還沒有試用過較舊的NSManagedObjectContextDidSaveNotification模式。

解決方案當然是在初始化之後,任何屬性分配完成之前將NSManagedObject添加到上下文中。

相關問題