我使用NSFetchedResultsController来处理进出UITableView的数据 . 一切正常,直到我把NSPredicate放在它上面 . 我需要获取与至少一条未过期或尚未设置expiration_date的消息有关系的所有Thread对象 . 所以我使用以下谓词 .
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];
问题是这会导致NSFetchedResultsController行为非常奇怪 . 如果线程在其消息关系中获得新消息,则删除该行 . 它也不会插入新的 .
我100%肯定是导致这些行为的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;
}
1 回答
我无法解释你观察到的谓词的奇怪效果,但我认为你的谓词并没有达到预期的效果 .
查找所有未设置expiration_date消息的线程或者具有可能不同的消息 . 你(可能)需要的是