2017-09-14 11 views
0

CoreData関係を遅延ロードする正しい方法は何ですか?レイジーロードCoreData関係

私はProjectオブジェクトとProjectFilterオブジェクトが既に存在する場合と存在しない場合がありますが、これは期待どおりに機能しますか?

- (ProjectFilter *)filter 
{ 
    [self willAccessValueForKey:@"filter"]; 
    ProjectFilter *filter = [self primitiveValueForKey:@"filter"]; 
    [self didAccessValueForKey:@"filter"]; 

    if (!filter) { 
     filter = [NSEntityDescription insertNewObjectForEntityForName:@"ProjectFilter" inManagedObjectContext:self.managedObjectContext]; 
     self.filter = filter; 
    } 
    return filter; 
} 

答えて

1

これは大したことではありません。

非常に単純なコアデータスタックでは、すべてのスレッドをメインスレッドで実行できます。しかし、あなたのアプリがより複雑になると、ほとんどの場合、バックグラウンドコンテキストが必要になります。コアデータへの複数のコンテキスト書き込みを同時に行うと、マージの競合が発生する可能性があります。マージされた競合を自動解決するようにコアデータに指示することはできますが、そうした方法でデータを失うことが保証されているため、これは素晴らしい解決策ではありません。したがって、一般的な解決策は、書き込みのために単一のキューを用意し、読み取り専用にメインスレッドキューを使用することです。

設定では、コアデータに書き込んでいるという事実は隠しています。したがって、単にproject.filterにアクセスすると、コアデータに書き込みが行われます。コアデータに書き込むタイミングと場所を管理しようとしている場合、開発者がこれを書き込みとして認識することは非常に非常に困難です。

コアデータがこの設定を使用していない場合でも、開発者がコアデータに書き込むタイミングを知ることはほとんどの場合重要です。書き込み後は保存する必要があります。書き込み後、取得された結果コントローラーに影響することに注意する必要があります。書き込み後、マージされた競合が発生する可能性があります。

+0

良い点は、このときより良いアプローチは何でしょうか? – trapper

+0

メソッド 'createFilterPropertyIfNeeded'が望ましいでしょう。 –