2013-01-12 11 views
7

私のiOSアプリケーションは、複数のスレッドを介してコアデータを使用しています。理由は次のとおりです: "'NSObjectInaccessibleException'、理由: 'CoreDataが' 0x1e07a9b0 'のフォールトを満たすことができませんでした。NSObjectInaccessibleException '、理由:' CoreDataがフォルトを実行できませんでした

私はこの問題の原因を理解しています。私は問題を解決するために取り組んでいますが、オブジェクトがこのようにフォールトが発生するかどうかを確認するために、バックグラウンドスレッドにチェックを追加したいと考えています。

if (!myObject.myValue) { 
    return; 
} 

...などのようなチェックをすることができます。彼はそのようなクラッシュを引き起こす可能性のある何かをする前に方法?あるいは単にmyObject.myValueを呼び出しても、それがヌルかどうかを確認しても、そのような例外がスローされますか?

+8

ちなみに、あなたは非常に低い回答受け入れをしているので、誰もあなたの質問に返答したいとは思わないでしょう。あなたの古い質問を見直し、それぞれの正しい答えを選択することを検討してください。 http://stackoverflow.com/users/353137/jason?tab=questions – iwasrobbed

答えて

19

あなたは試してみて、existingObjectWithID:error:を使用することができます。

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

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

議論

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

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

objectWithID:と異なり、このメソッドは決してフォルトを返しません。

あなたができる:

if ([myMOC existingObjectWithID:myObject.objectID error:&error]) 
    ... 
5

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

二つの方法:

  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]); 
} 
+0

方法#1、間違いなく。 「詳細」ビュー(同期の前/中にアクセス可能)で通知を待つことができ、オブジェクトとやり取りする機能を無効にしたり、ユーザーに通知したりすることができます。 – Mark

0

myObjectNSManagedObjectインスタンス

+0

オブジェクトがフォルトだけであるという事実は、そのプロパティのいずれかがこの例外をスローします。通常、データストアからデータをロードするだけです。例外は、このオブジェクトがデータストアにもはや存在せず、したがってロードできない場合にのみスローされる(a.k.a. "faulted")。 –

2

ここであなたは[myObject isFault]を確認することができますあなたはNSManagedObjectを使用する場合NSManagedContextが存在している確認することができます。 このように:

if (obj.managedObjectContext) 
{ 
    //do things 
} 
+0

私は同じ考えを持っていましたが、この動作を確認する文書は見つかりませんでした。誰でも確認できます、これはオブジェクトがまだ利用可能かどうかを確認するための決定的な方法ですか? –

関連する問題