1

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 は、実際に何もせずにすべてを台無しにするだけです。

どんな助けでも大歓迎です、ありがとう。

4

0 に答える 0