【发布时间】:2011-04-02 08:59:29
【问题描述】:
我正在玩一个使用 Core Data 和 NSManagedObjects 来填充 UITableView 的应用程序。我的应用程序中只有一个类,称为Event。我在Event 上创建了以下自定义实例方法:
- (BOOL)isExpired {
return ([[self.endOn dateAtEndOfDay] timeIntervalSinceNow] < 0);
}
我想将显示Event 对象的UITableView 限制为仅显示过期的事件——即isExpired 返回YES。我试图通过在NSFetchRequest 中添加NSPredicate 来做到这一点:
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary * bindings) {return([evaluatedObject isExpired]);}];
[fetchRequest setPredicate:predicate];
但我收到错误消息:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Problem with subpredicate BLOCKPREDICATE(0x272ac)'
***。这是否意味着您不能将块谓词与 NSFetchRequest 一起使用?还是我构造不当?
谢谢!
【问题讨论】:
-
我注意到
predicateWithBlock的文档指出“在 Mac OS X v10.6 中,Core Data 在内存和原子存储中支持此方法,但在基于 SQLite 的存储中不支持。”不过,没有关于这是否/如何影响 iOS(您的场景)的消息。您不会碰巧经营 SQLite 商店,因此这可能会影响您吗? -
@ig2r 这实际上是问题的答案。是的,iOS 也是如此。将打开并读取原子存储,您将创建所有
NSManagedObjects,因此您可以向它们调用消息。内存存储也是如此。但是对于 SQLite,NSManagedObjects 仅在商店请求时创建。将基于获取请求创建 SQLiteSELECT语句,同时考虑谓词。所以谓词在对象创建之前就已经应用了,因此你不能在它们上调用消息。 -
@ig2r & Joost 你能否请您在文档中这样提到它的位置?我有一种情况,我无法避免使用 predicateWithBlock 创建 FetchedResultsController。
标签: objective-c core-data nsfetchedresultscontroller nsfetchrequest