2011-02-10 11 views
0

コアデータはオブジェクトを遅延ロードし、参照しようとするとすぐにオブジェクトを取り込むことになっています。しかし、私はこのスキームにいくつかの問題を抱えています。コアデータの遅延ロードに関する問題

目的セット内のオブジェクトがまだロードされていないため、関係(セット)内のオブジェクトに対するC 2.0高速列挙が失敗し、コアデータによって管理されるオブジェクトのメンバがタッチされるまでawakeFromFetchは呼び出されません。例えば

、IのようなNSManagedObjectのサブクラスに関係している場合:私はこのような高速の列挙を使用してみた場合、直ちにそのオブジェクトのインスタンスをフェッチした後

@property (retain) NSSet* clips; 

を:

for (PClip* clip in self.clips) { 
    // do something with the clip 
} 

ループの本体が実行されることはありません。デバッガでは、クリップセット(実行時に_NSFaultingMutableSetのインスタンス)が最初は空であることがわかります。

または私は永続的な状態に由来しているクリップオブジェクトの非永続的なメンバー持っていると言う:

@property (retain) NSString* filename 

を私はawakeFromFetch用いた方法でこれを同期させるが、awakeFromFetchは、いくつかの永続的なメンバーになるまで呼び出されませんオブジェクトがロードされる前にこの非永続的な値にアクセスしようとすると、まだ定義されていません(つまり、ゼロになります)。

フェッチ要求に対してsetReturnsObjectsAsFaults:メソッドを使用することは役に立たないようです。フェッチされたオブジェクトに添付されたオブジェクトのツリーのすべてを強制的に取得するようには見えません。

オブジェクトを使用する前にオブジェクトが確実にロードされるようにするにはどうすればよいですか?高速列挙でオブジェクトのセットが読み込まれなかったのはなぜですか?

+0

今後は、「{}」エディターコントロールを使用して、問題のコードを適切にフォーマットしてください。 :-) –

答えて

0

(ハックのように思えますが)動作しているように見えるのは、オブジェクトのフルツリーをトップレベルオブジェクトのawakeFromFetchメソッドから追い越させることです。例えば

:あなたは

for (PClip* clip in self.clips) { 
    // do something with the clip 
} 

for (PClip* clip in clips) { 
    // do something with the clip 
} 

を交換する際に

-(void) awakeFromFetch { 
    // accessing the count of each relationship forces the set of objects to load 
    self.clips.count; 
    for (PClip* clip in self.clips) { 
     // access a persistent member of each object, which will cause 
     // its awakeFromFetch method to be called 
     clip.pathURL;  
    } 
} 
1

何が起こりますか?インスタンス変数のようなcoredata値は使用できません。セッターとゲッターを使用する必要があります。ゲッターはコアデータから値を取得するためです。

最初にアクセスしたときにオブジェクトを作成するfilenameのゲッターを作成してみます。

私の経験から、awakeFromFetchでは何もする必要はありません。

+0

申し訳ありませんが、それは単に私の一部の省略です。私はその問題を修正するために編集しました。 – CuriousKea

1

私は管理オブジェクトのプロパティがデフォルトで読み込まれると思います。関係をロードするには
は、あなたがこのような何かがありますFRCを使用した場合、
NSArray *relationshipKeys = [NSArray arrayWithObject:@"clips"];
[fetchRequest setRelationshipKeyPathsForPrefetching:relationshipKeys];

0

@CuriousKeaだけのヒントを、あなたはawakeFromFetch関係を設定しないでください。関係を設定するとFRCに再度通知され、FRCデリゲートが2回呼び出されるためです。パフォーマンスが痛い。