我正在玩一个使用核心数据和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一起使用?或者我只是不恰当地构建了它?
谢谢!
发布于 2010-08-23 15:18:38
因此,似乎我们已经在对原始帖子的评论中确定,这可能是由于SQLite存储与块谓词不兼容造成的,因为核心数据无法将这些转换为SQL语句以在存储中运行它们(感谢JoostK)。
可能有几种方法可以克服这个问题:
$NOW,以提供对当前日期的访问。这具有使谓词模板显示在模型编辑器中的优点。然而,isExpired方法)的缺点。因此,另一种方法是首先获取所有符合条件的实体,而不考虑它们的过期状态,然后在结果实体集上运行专用的过滤步骤,以剔除未过期的实体。因为到那时,它们已经从存储中完全复活了,所以您应该能够为此使用块谓词。发布于 2011-06-15 19:37:49
您可以在不指定谓词的情况下执行普通的fetch请求,然后过滤结果数组:
NSArray *allEvents = [context executeFetchRequest:fetchRequest];
if (!allEvents) { // do error handling here
}
NSArray *expiredEvents = [allEvents filteredArrayUsingPredicate:predicate];https://stackoverflow.com/questions/3543208
复制相似问题