2012-08-08 67 views
6

childContext和parentContext是 「NSMainQueueConcurrencyType」 兩個嵌套的NSManagedObjectContext保存的objectID

[childContext performBlock:^(void) { 
    [childContext save:NULL]; 

    [parentContext performBlock:^(void) { 
    [parentContext save:NULL]; 
    // Why is objectID for the inserted NSManagedObject still a temporary one here? 
    }]; 
}]; 

問:

  1. 這是救兩個孩子和家長方面
  2. 爲什麼纔是正道它保存後,插入NSManagedObject的objectID仍然是一個臨時的?

回答

3

我可以想到在少數情況下,您希望將主隊列MOC作爲另一個主隊列MOC的子項,但看到這肯定讓我想問:兩者的優點是:他們是NSMainQueueConcurrencyType?

此外,這是一個已知的錯誤(至少已經報道了很多次)。當您從子上下文中插入並保存時,只有直接連接到持久存儲的那個ID纔會發生突變。所以,在保存新插入的項目時,您有幾個選擇。

  1. 保存前獲取持久性ID。
  2. 致電[moc refreshObject:object mergeChanges:NO]並將所有引用設置爲nil。最父後
  3. 採集永久標識可以節省

我喜歡#3,因爲它需要蘸到數據庫中。如果你之後這樣做,它可以從父母那裏獲得。

+1

要回答您的答案中的問題:創建一個孩子MOC作爲一個「暫存區」進行一系列更改,允許它們以原子方式保存或拒絕。 (換句話說,如果用戶點擊取消按鈕,您只需丟棄MOC而不保存它。) – benzado 2012-09-26 21:03:33