2012-07-03 58 views
2

我有一個應用程序設置很像iCloudCoreDataRecipes示例(即使用Core Data與iCloud一起使用)。在應用程序的委託,我觀察在iCloud通知中訪問已刪除的對象

NSPersistentStoreDidImportUbiquitousContentChangesNotification 

當一個通知到達,我叫

[context mergeChangesFromContextDidSaveNotification:note]; 

我有一些額外的處理,我想當收到此通知的事,但我有麻煩使用由NSManagedObjectID標識的對象存在於NSDeletedObjectsKey集合中。

NSSet *deletedObjects = [info objectForKey:NSDeletedObjectsKey]; 
for (NSManagedObjectID *oid in deletedObjects) { 
    NSManagedObject *obj = [context objectWithID:oid]; 
} 

如果我訪問了OBJ任何財產,它是零。

我又試圖在調用mergeChangesFromContextDidSaveNotification運行上面的代碼:

當我這樣做,我能,大部分時間,訪問對象的屬性。在某些情況下,我會收到的例外,無法履行故障;該記錄已從核心數據存儲中刪除。

我意識到,如果在通知到達之前(即,如果在應用程序中查看/訪問對象)某個對象已加載到上下文中,則訪問已刪除對象的屬性將會起作用。

我的問題是,我想做一些清理與刪除的對象相關;我的NSManagedObject擁有一個我想閱讀的屬性,然後用它在與該值相關的Core Data之外執行一些工作。

我錯過了什麼?是否有可能做到這一點?

回答

2

你或許應該看看

- (void)prepareForDeletion; 

,並覆蓋在你的NSManagedObject子類。

+0

謝謝,這可能會奏效。它會在mergeChangesFromContextDidSaveNotification之前調用受影響的對象:但重要的是屬性值存在而不是零。在非iCloud場景中,可以從通知的userInfo(插入,更新或刪除)中提取NSManagedObjects並使用它們,因此我原本期望類似。 – azsromej

+1

這個答案應該有成千上萬的upvotes! :)我花了很多時間嘗試執行基於對象的屬性的簡單操作,當它們被刪除並敲擊牆壁時,因爲我正在響應NSDeletedObjectsKey通知,當實際對象沒有響應時,不再存在,其屬性不能被訪問。非常感謝您的先生,我希望很多人能夠像我一樣浪費大量時間來找到您的答案! – cdf1982