Core Data を使って友達を救うアプリを書いています。NSTableView は、ステータス (オンライン、オフライン、お気に入りとしてマーク) に応じて、すべての友達を互いに分けて表示することになっています。セクションの特定の友達を取得するには、NSArrayController を使用します。
次のコードでは、特定の配列コントローラーに設定した述語を確認できます。
_onlineFriendsController.fetchPredicate = [NSPredicate predicateWithFormat:@"(favourite = NO || favourite = nil) && id in %@", self.onlineFriendsID];
_offlineFriendsController.fetchPredicate = [NSPredicate predicateWithFormat:@"(favourite = NO || favourite = nil) && not (id in %@)", self.onlineFriendsID;
期待どおりに_onlineFriendsController
機能します。お気に入りではなく、オンラインの友達をフェッチします。ただし、_offlineFriendsController
動作しません。利用可能であるにも関わらず、お気に入りにされていないすべての友達を取得します。
また、ブロックを使用して述語を設定して、デバッグを少し改善しようとしました。
_offlineFriendsController.fetchPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
if (![[evaluatedObject valueForKey:@"favourite"] boolValue]) {
if (![self.onlineFriendsID containsObject:[evaluatedObject valueForKey:@"id"]]) {
return YES;
}
}
NSLog(@"%@", [evaluatedObject valueForKey:@"name"]);
return NO;
}];
これは、オンラインのすべてのユーザーに対して NO を返します。_offlineFriendsController
とにかく、すべての友達を取得したことがわかりました。私は何を間違っていますか?コントローラーの managedObjectContext、sortDescriptors、fetchPredicate、および entityName のみを設定しました。とにかく、filterPredicate と fetchPredicate の違いは何ですか? filterPredicate は、実際に何もせずにすべてを台無しにするだけです。
どんな助けでも大歓迎です、ありがとう。