8

私の iOS アプリは、複数のスレッドを介してコア データを使用します。「'NSObjectInaccessibleException'、理由: 'CoreData は '0x1e07a9b0 '' の障害を実行できませんでした」というメッセージのクラッシュ レポートを取得しています。

この問題の原因を理解しています - オブジェクトは削除されましたが、別のスレッドがそれにアクセスしようとしています。問題の解決に取り組んでいますが、バックグラウンド スレッドにチェックを追加して、オブジェクトがこのように失敗するかどうかを確認したいと考えています。

現時点での私のコードはmyObject.myValue. 次のようなチェックを行うことは可能ですか。

if (!myObject.myValue) {
    return;
}

...そのようなクラッシュを引き起こす可能性のある何かを行う前に、メソッドから抜け出すようにしますか? または、 null かどうかを確認するために単に を呼び出すとmyObject.myValue、そのような例外がスローされますか?

4

5 に答える 5

19

あなたは試して使うことができますexistingObjectWithID:error:

指定された ID のオブジェクトを返します。

   - (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error

討論

指定された ID を持つ管理対象オブジェクトがコンテキストに既に登録されている場合は、そのオブジェクトが直接返されます。それ以外の場合、対応するオブジェクトはコンテキストにフォールトされます。

データがキャッシュされていない場合、このメソッドは I/O を実行する可能性があります。

objectWithID: とは異なり、このメソッドはエラーを返しません。

あなたはできる:

if ([myMOC existingObjectWithID:myObject.objectID error:&error])
    ...
于 2013-01-12T20:36:09.150 に答える
5

オブジェクトが別のスレッドで削除される可能性があるという問題がある場合は、変数にアクセスする前にオブジェクトが存在することを確認する必要があります。

2 つの方法:

  1. データが削除されるたびに、ビュー データソースを更新します。これを行うには、通知を登録し、そのNSManagedObjectContextObjectsDidChangeNotification通知を解析しuserInfoて削除されたオブジェクトを確認します。
  2. 複数のスレッドにデータを渡す場合は、次のようなコードを使用します。

例:

// Cache and pass the object's ID off to another thread to do work on
// You can just store it as a property on the class
@try {
    NSManagedObject *theObject = [managedObjectContext objectWithID:self.theObjectID];

    // do stuff with object
}
@catch (NSException * e) {
    // An entity with that object ID could not be found (maybe they were deleted)
    NSLog(@"Error finding object: %@: %@", [e name], [e reason]);
}
于 2013-03-12T12:58:05.363 に答える
0

インスタンス[myObject isFault]がどこにmyObjectあるかを確認できますNSManagedObject

于 2015-02-02T14:25:42.763 に答える