首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFetchedResultsController与NSPredicate

NSFetchedResultsController与NSPredicate
EN

Stack Overflow用户
提问于 2014-02-28 22:10:18
回答 1查看 256关注 0票数 0

我正在使用NSFetchedResultsController来处理进出UITableView的数据。在我把一个NSPredicate放在上面之前,一切都很好。我需要获取所有线程对象,这些对象与至少一条尚未过期或尚未设置expiration_date的消息有关系。所以我使用以下谓词。

代码语言:javascript
复制
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];

问题是,这导致NSFetchedResultsController的行为非常奇怪。如果线程在其消息关系中获得新消息,它将删除该行。它也没有插入新的。

我百分之百肯定是NSPredicate导致了这些行为。没有它,一切正常--我只是没有一些我不想被过滤掉的数据。

下面是我的数据模型中讨论过的部分的图片。我还将包括我的NSFetchedResultsController的代码。

代码语言:javascript
复制
/**
 * 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;
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 22:19:44

我无法解释您所观察到的谓词的奇怪效果,但我假设您的谓词没有达到预期的效果。

代码语言:javascript
复制
[NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]];

查找所有具有expiration_date未设置消息的线程或可能有不同消息未过期的线程。你(可能)需要的是

代码语言:javascript
复制
[NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.expiration_date == null OR $m.expiration_date > %@).@count > 0", [NSDate date]];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22106799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档