2011-11-17 74 views
0

我正在编写一个应用程序,显示一些基于一周中某天的变化的数据。该应用程序的上下文是即将举行的会议。我想显示当天的日历条目。事件细节存储在coredata中。iOS CoreData NSPredicate不清除

我用什么来创建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显示)没有按” t得到更新。

谢谢, 马特。

+0

没有你在你的问题有代码的触动的tableview在所有。你为什么期望tableview奇迹般地改变? – deanWombourne

回答

1

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

1)该表将只更新时[tableView reloadData]或其他重载方法被调用

2)如果设置为NSFetchedResultsController的委托,你可以回应模型更改并重新加载表

3)日期变化不是模型变化(除非你在模型本身中更新日期),NSFetchedResultsController只会在检测到它的管理对象上下文发生变化时才会自行更新。

4)当你改变谓词(即请求)时,你需要做fetchedResultsController:performFetch:error。否则,表格将重新加载旧数据。

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

编辑:澄清答案,一个performFetch必要时谓语改变

+0

虽然在调用这个函数时,我一直在调用[tableView reloadData],但数据不会被更新。 –

+1

你在做我上面所说的一切吗?当你改变fetchedResultsController使用的请求时,你需要在'reloadData'之前调用'performFetch:...'。如果你不改变请求,你需要。该请求在创建时使用当前日期。它不会跟踪日期更改本身。 – XJones

+0

好的,谢谢你提供的信息。真的涵盖了很多东西。至于要解决的问题,我必须清除抓取的结果缓存,然后才能正确更新。 –