71

NSManagedObject削除され、その管理対象オブジェクトを含むコンテキストが保存されました。Core Data が永続ストアに次の保存操作中にオブジェクトを削除するように要求した場合、それisDeletedが返されることを理解しています。YESただし、保存は既に行われているため、 をisDeleted返しますNO

含まれているコンテキストが保存された後NSManagedObjectに が削除されたかどうかを確認する良い方法は何ですか?

(削除された管理対象オブジェクトを参照しているオブジェクトがまだ削除を認識していない理由を知りたい場合は、performSelectorOnMainThread:withObject:waitUntilDone:.

4

5 に答える 5

94

管理対象オブジェクトのコンテキストを確認するとうまくいくようです:

if (managedObject.managedObjectContext == nil) {
    // Assume that the managed object has been deleted.
}

上のAppleのドキュメントからmanagedObjectContext...

レシーバーがそのコンテキストから削除されている場合、このメソッドは nil を返すことがあります。

レシーバーに障害がある場合、このメソッドを呼び出しても起動しません。

どちらも良さそうです。

更新:objectWithID:特に使用して取得した管理対象オブジェクトが削除されたかどうかをテストしようとしている場合は、 Dave Gallagher の回答を確認してください。objectWithID:彼は、削除されたオブジェクトの ID を使用して呼び出すと、返されるオブジェクトはnilに設定されていないフォールトになると指摘しています。したがって、削除されたかどうかをテストするためにmanagedObjectContext単純にチェックすることはできません。managedObjectContext可能であれば使用existingObjectWithID:error:してください。そうでない場合、たとえば、Mac OS 10.5 または iOS 2.0 をターゲットにしている場合は、削除をテストするために別のことを行う必要があります。詳細については、彼の回答を参照してください。

于 2010-12-02T22:35:35.110 に答える
15

持続性を Core Data に依存する iOS アプリに iCloud を実装した最近の経験から、最良の方法はフレームワークの通知を監視することであることに気付きました。少なくとも、管理対象オブジェクトが削除されたかどうかを通知する場合と通知しない場合があるあいまいなメソッドに依存するよりはましです。

「純粋な」Core Data アプリの場合、メイン スレッドでNSManagedObjectContextObjectsDidChangeNotificationを観察する必要があります。通知のユーザー情報ディクショナリには、挿入、削除、および更新された管理対象オブジェクトの objectID のセットが含まれています。

管理対象オブジェクトの objectID がこれらのセットのいずれかにある場合は、アプリケーションと UI を適切な方法で更新できます。

以上です... 詳細については、Apple の Core Data Programming Guide の Concurrency with Core Data の章を参照してください。「通知を使用して他のスレッドの変更を追跡する」というセクションがありますが、前の「同時実行をサポートするためにスレッドの制限を使用する」を確認することを忘れないでください。

于 2012-01-12T01:11:00.500 に答える