Эффективный способ обновить заголовки разделов таблицы с помощью сущностей Core Data?

Я использую NSFetchedResultsController для моего UITableView, который отображает кучу событий, хранящихся в основных данных.

Я пытаюсь сгруппировать таблицу по относительной дате (например, сегодня, завтра, на этой неделе и т. Д.). Каждое событие имеет дату начала, и я попытался создать временное свойство в сущности события под названием sectionIdentifier, которое преобразует дату в относительную дату, как указано выше, например:

- (NSString*)sectionIdentifier
{    
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];

if (!tmp) 
{
    tmp = [Utility formattedDateRelativeToNow:self.startTime];
    [self setPrimitiveSectionIdentifier:tmp];
}
return tmp;
}

Проблема в том, что он, очевидно, делает это только один раз и не обновляется, если дата не изменена, чего я действительно не ожидаю. Я подумал о том, чтобы переопределить метод доступа getStartDate для обновления sectionIdentifier, хотя это кажется немного тяжелым и неэффективным, поскольку он будет выполнять это обновление каждый раз, когда я получаю доступ к этому свойству.

Любые идеи?


person James    schedule 13.08.2011    source источник


Ответы (2)


Лучший способ сделать это довольно нелогичный. Вместо изменения полученного контроллера результатов или чего-либо в Core Data, вы расширяете NSDate категорией, чтобы иметь имя ключа / метод, который возвращает значение на основе соответствующего вычисления даты. Затем вы включаете ключевое имя / метод в контроллер извлеченных результатов sectionNameKeyPath.

См. Этот предыдущий ответ для примера , как расширить NSDate с помощью имени ключа / методов, как сегодня , вчера, завтра и т. д.

Чтобы использовать это, вы просто возьмете метод на атрибут даты объекта, который извлекает полученный контроллер результатов следующим образом:

NSFetchedResultsController *frc=[[NSFetchedResultsController alloc] initWithFetchRequest:aFetch 
                                                                    managedObjectContext:aMoc 
                                                                      sectionNameKeyPath:@"startdate.yesterday" 
                                                                               cacheName:nil];

... и разделы появятся автоматически.

person TechZen    schedule 13.08.2011

Я думаю, вам нужно будет обновлять заголовки разделов так часто, как минимально время, в течение которого вы отображаете раздел (который, кажется, составляет один день). Я бы поступил следующим образом:

1) Сохраните текущую отметку времени в applicationDidFinishLaunching, используя NSUserDefaults и т. Д.

2) При следующем запуске приложения определите разницу между текущей меткой времени и сохраненной.

3) Если разница превышает вашу наименьшую продолжительность (один день), заново сгенерируйте таблицу, включая заголовки разделов, так как «Сегодня» превратилось бы в «Вчера», а «Вчера» могло бы стать на прошлой неделе.

HTH,

Акшай

person Akshay    schedule 13.08.2011