我正在使用一个使用 Core Data 和 NSManagedObjects 来填充 UITableView 的应用程序。我的应用程序中只有一个类,称为Event
。我创建了以下自定义实例方法Event
:
- (BOOL)isExpired {
return ([[self.endOn dateAtEndOfDay] timeIntervalSinceNow] < 0);
}
我想限制UITableView
显示Event
仅反对过期的事件 - 也就是说,isExpired
回报YES
。我尝试通过添加一个来做到这一点NSPredicate
to the NSFetchRequest
:
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 一起使用?或者我只是构建不当?
谢谢你!
因此,我们似乎已经在原始帖子的评论中确定,这可能是由于 SQLite 存储与块谓词不兼容造成的,因为 Core Data 无法将这些谓词转换为 SQL 以在存储中运行它们(感谢 JoostK)。
可能有几种方法可以克服这个问题:
- 假设实体的结束日期是常规属性,您也许能够将到期约束表示为谓词格式字符串而不是块谓词,Core Data 应该能够将其转换为 SQL 子句。
- 如果上述情况可行,您可能会更喜欢使用获取请求模板 http://developer.apple.com/iphone/library/documentation/cocoa/conceptual/CoreData/Articles/cdUsingMOM.html#//apple_ref/doc/uid/TP40005190-SW7检索过期的项目。您需要传递一个替换变量,例如
$NOW
不过,可以访问当前日期。这样做的优点是使谓词模板显示在模型编辑器中。
- 然而,这两种方法都有重复现有功能的缺点(即您的
isExpired
方法)。因此,另一种方法是首先获取所有合格实体,无论其过期状态如何,然后对结果实体集运行专用过滤步骤以清除未过期的实体。因为到那时,它们已经从商店中完全复活,您应该能够为此使用块谓词。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)