我正在使用NSFetchedResultsController来处理进出UITableView的数据。在我把一个NSPredicate放在上面之前,一切都很好。我需要获取所有线程对象,这些对象与至少一条尚未过期或尚未设置expiration_date的消息有关系。所以我使用以下谓词。
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];问题是,这导致NSFetchedResultsController的行为非常奇怪。如果线程在其消息关系中获得新消息,它将删除该行。它也没有插入新的。
我百分之百肯定是NSPredicate导致了这些行为。没有它,一切正常--我只是没有一些我不想被过滤掉的数据。
下面是我的数据模型中讨论过的部分的图片。我还将包括我的NSFetchedResultsController的代码。
/**
* Returns a NSFetchedResultsController for the unified inbox
*
* @return Controller for fetched results
*/
- (NSFetchedResultsController *)resultsControllerForUnifiedInbox
{
NSFetchRequest *threadsRequest = [NSFetchRequest fetchRequestWithEntityName:@"Thread"];
NSEntityDescription *threadModel = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:_mainManagedObjectContext];
[threadsRequest setEntity:threadModel];
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];
[threadsRequest setPredicate:threadPredicate];
NSSortDescriptor *threadSort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
[threadsRequest setSortDescriptors:[NSArray arrayWithObject:threadSort]];
[threadsRequest setFetchBatchSize:LiftFetchControllerAtrributeBatchSize];
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:threadsRequest
managedObjectContext:_mainManagedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
return fetchedResultsController;
}

发布于 2014-02-28 22:19:44
我无法解释您所观察到的谓词的奇怪效果,但我假设您的谓词没有达到预期的效果。
[NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];查找所有具有expiration_date未设置消息的线程或可能有不同消息未过期的线程。你(可能)需要的是
[NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.expiration_date == null OR $m.expiration_date > %@).@count > 0", [NSDate date]];https://stackoverflow.com/questions/22106799
复制相似问题