尽管日期不在查询范围内,但 NSPredicate 不会过滤掉点符号访问的日期

NSPredicate not filtering out dates accessed by dot notation though the dates don't fall in the query range

我有一个匹配项的到期日期,我希望从获取请求中过滤掉到期日期大于当前日期的对象...这是获取请求谓词的代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:NSStringFromClass([SMLMatch class])inManagedObjectContext:[SMLCDManager mainQContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"expirationDate.date > %@", [NSDate date]];
[fetchRequest setPredicate:predicate];
[fetchRequest setFetchBatchSize:20];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updatedAt" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
DDLogDebug(@"Grabbing Chats/matches after date: %@", [NSDate date]);

到期日期是一个带有 NSDate 的可转换对象,"date"...

这种查询有效,但似乎返回了奇怪的结果,我想知道这个问题是否与我使用点表示法访问 SMLMatch 匹配到期日期变量的事实有更多关系...任何为什么像这样访问日期会出现问题?

这是输出日志:

Grabbing Chats/matches after date: 2015-01-06 01:02:27 +0000

当我打印出 expirationDate.date 时,它们显示在获取的结果控制器 table 视图中:

ExpirationDate: 2015-01-05 02:23:25 +0000 User: Zoe
ExpirationDate: 2015-01-05 09:35:22 +0000 User: Jamie

如您所见,Zoe 和 Jamie 的过期日期确实早于当前日期,不应该出现在结果中,但令人惊讶的是,他们确实出现在查询结果中!另外,查看所有打印日期的时区,它们似乎都处于 +0000 时区偏移量......我可以使用 [NSDate date] 查询当前日期吗?我见过其他人在日历外构造日期输入,但那只是在你想指定一个不同的范围或日期而不是当前日期的情况下。

为什么这些日期会传递这个谓词?

我按以下方式使用此谓词构建获取结果控制器:

_fetchController = [[NSFetchedResultsController alloc] initWithFetchRequest:[self fetchRequest] managedObjectContext:[SMLCDManager mainQContext] sectionNameKeyPath:nil cacheName:nil];
_fetchController.delegate = self;

发现将日期嵌入到可转换类型中无法使用谓词进行查询...我猜这似乎很明显,事后这行不通

所以,expirationDate.date,是罪魁祸首。当我将日期移到它自己的日期时 属性 它起作用了。

因此谓词简单地更改为: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"expirationDate > %@", [NSDate date]];

一切皆大欢喜