1

これでうまくいくと思いましたが、なぜ間違っているのかわかりません。以下のコードの述語を使用して、フェッチされた結果コントローラーがあります。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"SearchResult" inManagedObjectContext:[[DataInterfaceObject sharedAlloc] managedObjectContext]];    
[fetchRequest setEntity:entity];    
[fetchRequest setFetchBatchSize:10];

// Results Table predicate
NSPredicate *predicate_Results = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: [ResultsTableVC resultsPredicate], [NSPredicate predicateWithFormat:@"searchUsed.isCollapsedView == NO"], nil]];

// Favorites Table predicate
NSPredicate *predicate_Favorites = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: [FavoritesTableVC favoritesPredicate], [NSPredicate predicateWithFormat:@"favoritesInfoLink.isCollapsedView == NO"], nil]];

// Full predicate
NSPredicate *predicate = 
[NSCompoundPredicate orPredicateWithSubpredicates: [NSArray arrayWithObjects: 
                                                    predicate_Results, predicate_Favorites, nil]];

[NSFetchedResultsController deleteCacheWithName:@"resultsCache"];
[fetchRequest setPredicate:predicate];

目的はSearchResult、述語に一致するすべてのエンティティをフェッチすることです。SearchResultエンティティには、searchUsedSearchResult<<->SearchTermsのような関係があります。SearchTermsにはプロパティがありますisCollapsedView

ユーザーはビューをタップして、対応するオブジェクトビューを折りたたむことができます。その時点で、searchUsed.isCollapsedViewの値が更新され、mocに保存されます。私はこれが起こっていることを確認しました。

この変更がフェッチされた結果コントローラーによって認識され、デリゲートメソッドが起動することを期待していましたが、起動しません。

デリゲートメソッドは、検索エンティティが挿入、削除、または更新されたときに起動します。

これは間違って設定されていますか、それとも私の期待は間違っていますか?私はそれについて何ができますか?

4

2 に答える 2

2

あなたの期待は間違っています。SearchResultエンティティの属性またはリレーションの変更に対してのみ起動し、リレーションの属性変更に対しては起動しません。

データを非正規化し、折りたたみ状態のブール値をモデルに取り込む(またはビットフィールドなどを使用する)SearchResult場合は、デリゲート呼び出しのメリットが得られます。

于 2012-07-22T00:01:30.037 に答える
1

entity割り当てで参照されているタイプのエンティティのプロパティに触れるだけで十分であることがわかりました。次に、エンティティはmocによって変更/更新として識別されます。どうやら、その時点で、frcは述語(関係を含む)をそれらの変更されたエンティティに適用して、挿入、削除、または更新があるかどうかを判断します。(タッチすると、既存の値と同じ値を割り当ててからmodに保存するだけです。)これにより、リレーションシップエンティティに既にキャプチャされているプロパティを追加する必要がなくなります。

于 2012-07-22T15:30:22.107 に答える