iOS CoreData NSPredicate 未清除

Posted

技术标签:

【中文标题】iOS CoreData NSPredicate 未清除【英文标题】:iOS CoreData NSPredicate not clearing 【发布时间】:2011-11-17 12:53:35 【问题描述】:

我正在编写一个应用程序来显示一些数据,这些数据会根据它所在的星期几而变化。该应用程序的上下文是用于即将举行的会议。我想显示那天的日历条目。存储在 coredata 中的事件详细信息。

我用来创建 NSPredicate 的是:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate *today = [NSDate date];
NSString *sunday = @"2011-12-04";
NSString *monday = @"2011-12-05";
NSString *tuesday = @"2011-12-06";
NSString *wednesday = @"2011-12-07";
NSInteger dayNumber = 1;

if ([[df stringFromDate:today] isEqualToString:sunday]) 
    dayNumber = 2;
 else if ([[df stringFromDate:today] isEqualToString:monday]) 
    dayNumber = 3;
 else if ([[df stringFromDate:today] isEqualToString:tuesday]) 
    dayNumber = 4;
 else if ([[df stringFromDate:today] isEqualToString:wednesday]) 
    dayNumber = 5;


NSExpression *lhs = [NSExpression expressionForKeyPath:@"day_number"];
NSExpression *rhs = [NSExpression expressionForConstantValue:[NSNumber numberWithInt:dayNumber]];

NSPredicate *equalToPredicat = [NSComparisonPredicate predicateWithLeftExpression:lhs
                                                                  rightExpression:rhs
                                                                         modifier:NSDirectPredicateModifier
                                                                             type:NSEqualToPredicateOperatorType
                                                                          options:0];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:/*sortDescriptorDayNumber,*/ sortDescriptorTime, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setPredicate:equalToPredicat];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                            managedObjectContext:managedObjectContext 
                                                                                              sectionNameKeyPath:@"day_number" 
                                                                                                       cacheName:@"TodayCache"]

我看到的是,当日期更改时(即:周六到周日),数据(显示在 UITableView 中)没有得到更新。

谢谢, 马特。

【问题讨论】:

您的问题中的任何代码都没有触及表格视图。为什么你会期望 tableview 神奇地改变? 【参考方案1】:

上面的评论是正确的。更多信息。

1) 表只会在[tableView reloadData] 或其他重载方法之一被调用时更新

2) 如果您为 NSFetchedResultsController 设置了一个委托,您可以响应模型更改并重新加载表格

3) 日期更改不是模型更改(除非您在模型本身中更新日期),并且 NSFetchedResultsController 仅在检测到其托管对象上下文已更改时才会更新自身。

4) 当日期发生变化时,您需要执行fetchedResultsController:performFetch:error,您正在更改谓词(即请求)。否则,表格将重新加载旧数据。

要根据日期更改刷新表格,您需要以您喜欢的任何时间间隔检测日期更改并在那时重新加载表格。您可以这样做的一种方法是计算当前时间和午夜之间的时间间隔,并设置一个计时器在该时间间隔之后触发。当计时器触发时,更改谓词,使用结果控制器执行Fetch 并重新加载表。然后设置一个新的计时器,直到下一个午夜。如果您希望在用户时区完成此操作,您还需要考虑到这一点。

编辑:明确回答谓词更改时需要performFetch

【讨论】:

我一直在调用 [tableView reloadData] 虽然在调用它时,数据没有得到更新。 你在做我上面说的一切吗?当您更改 fetchedResultsController 使用的请求时,您需要在 reloadData 之前调用 performFetch:...。如果您不更改请求,则需要更改。该请求使用创建时的当前日期。它不会自行跟踪日期更改。 好的,感谢您提供的信息丰富的回答。真的涵盖了很多东西。至于正在解决的问题,我必须清除获取的结果缓存,然后才能正确更新。 很高兴你能成功。仅针对此问题,您不需要清除缓存。 performFetch: 将对新请求所需的任何缓存值使用缓存,但它会从存储中加载任何新内容。但是,如果您在另一个 managedObjectContext 中更新存储(通常在后台),那么您需要合并这些更改并适当地使用 fetchedResultsController 委托方法。玩得开心!

以上是关于iOS CoreData NSPredicate 未清除的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 和 NSPredicate

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

将关系过滤器添加到 NSPredicate

CoreData:NSPredicate 按日期过滤

CoreData:基于关系的 NSPredicate

NSPredicate 中的 SQL ORDER BY 等价物 - CoreData