Эффективный способ обновления заголовков разделов таблицы с использованием сущностей Core Data? - PullRequest
3 голосов
/ 13 августа 2011

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

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 13 августа 2011

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

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

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

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

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

1 голос
/ 13 августа 2011

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

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

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

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

НТН,

Акшай

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...