iOS CoreData NSP предикат не очищается - PullRequest
0 голосов
/ 17 ноября 2011

Я пишу приложение, которое отображает некоторые данные, которые меняются в зависимости от дня недели.Контекст приложения заключается в том, что оно предназначено для предстоящей конференции.Я хочу отобразить записи календаря на этот день.Подробная информация о событии хранится в 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) не обновляются.

Спасибо, Мэтт.

1 Ответ

1 голос
/ 17 ноября 2011

Комментарий выше верен.Некоторая дополнительная информация.

1) Таблица будет обновляться только при вызове [tableView reloadData] или одного из других методов перезагрузки

2) Если вы установите делегат для NSFetchedResultsController, на который вы можете ответитьизменения модели и перезагрузка таблицы

3) Изменение даты не является изменением модели (если вы не обновляете дату в самой модели), а NSFetchedResultsController будет обновляться только в том случае, если обнаружит, что его контекст управляемого объекта имеетизменилось.

4) Вам нужно сделать fetchedResultsController:performFetch:error, когда при смене дня ч / б вы меняете предикат (т.е. запрос).В противном случае таблица будет перезагружена со старыми данными.

Чтобы обновить таблицу на основе изменения даты, вам необходимо обнаружить изменение даты с любым интервалом, который вам нравится, и перезагрузить таблицу в это время.Один из способов сделать это - вычислить интервал между текущим временем и полуночью и установить таймер на срабатывание после этого интервала.Когда таймер сработает, измените предикат, executeFetch с контроллером результатов и перезагрузите таблицу.Затем установите новый таймер до следующей полуночи.Если вы хотите, чтобы это было сделано во временном поясе пользователя, вам также необходимо это учесть.

РЕДАКТИРОВАТЬ: уточненный ответ, что performFetch необходимо, когда предикат изменяется

...