2016-08-17 76 views
1

我在iOS中遇到了父/子託管對象上下文的問題。我記得一個標準的用例是使用臨時的子託管對象上下文,以便用戶可以決定按save並通過save()調用將更改傳播給父項,或者可以通過讓子項放棄用戶的更改Moc消失。從子項保存對象NSManagedObjectContext在父項中不可用

我創作的孩子是這樣的:

childMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
childMoc.parentContext = parentMoc 

然後我創建一個使用

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(... 

我完成填充其所有必要的變量和我的閃亮的新對象後在childMoc對象幾個依賴對象,我在Swift中使用此代碼嘗試訪問父上下文中的新對象:

childMoc.performBlock({ 
    do { 
     try childMoc.save()  
     parentMoc.performBlock({ 
      do { 
       try parentMoc.save()     
       do { 
        let objectInParentMoc = try parentMoc.existingObjectWithID(objectInChildMoc.objectID) as? TheRightType     
       } catch { 
        print("Couldn't find object in parent") 
       }  
      } catch { 
       print("Couldn't save parent") 
      } 
     }) 
    } 
    catch { 
     print ("Couldn't save child") 
    } 
}) 

我總是得到「無法找到父對象」。我錯過了什麼?我看到使用NSManagedObjectContext保存通知的舊示例代碼,但是我讀到這些不再需要父子受管對象上下文。上面的代碼基於最新的ObjectiveC代碼,人們聲稱它的工作原理(但是使用try/catch的東西迅速拋出它)。例如,這個鏈接Correct implementation of parent/child NSManagedObjectContext暗示了上面的設置應該工作。

+0

只是澄清 - 對象是保存在父MOC。如果我稍後進行抓取,我會找到它。因此,existingObjectWithID似乎是在父級管理對象上下文中查找對象的錯誤方法。 –

+0

我試着跳過整個'existingObjectWithID'調用,代碼似乎一直工作,直到我們試圖刪除一個對象,然後它抱怨必須從錯誤的上下文中刪除一個對象。 –

回答

0

好的,這是一個錯誤!已知多年的錯誤,但只在StackOverflow中記錄。答案就在這裏 https://stackoverflow.com/a/11996957/2073793

人們需要在孩子情況下保存之前使用 obtainPermanentIDs(for:) 獲得永久對象ID。然後,那些永久的ObjectIds可以用來從父上下文中檢索對象。

相關問題