我编写了一个使用 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 只是在没有实际做某事的情况下搞砸了所有事情。
非常感谢任何帮助,谢谢。