Пакетные результаты выборки базовых данных
Я выполняю запрос на выборку, который возвращает около 2000 объектов. В настоящее время это занимает около 20 секунд на моем устройстве. Поэтому я подумал, что мог бы установить предел выборки 100, а затем, когда пользователь прокручивает до конца табличного представления, получить следующие 100 объектов. Это может быть достигнуто с помощью NSFetchRequest's
setFetchLimit
а также setFetchOffset
,
Однако, что я не могу понять, так это то, что, если бы при втором извлечении, где я выбираю объекты 101-200, что произошло бы с объектами 1-100? Должен ли я использовать отдельный NSFetchedResultsController
для каждых 100 элементов, а затем настроить методы источника данных моего табличного представления для запроса на основе нескольких контроллеров результатов выборки? Или я могу как-то использовать то же самое NSFetchedResultsController
каким-то образом получить 100 объектов одновременно, но при каждой последующей выборке просто добавлять следующие 100 элементов к исходным 100 элементам?
Изменить: вот мой код:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:5];
2 ответа
На самом деле вам не нужно ничего делать, чтобы получить выборку партиями указанного вами размера. Вы получите описываемое вами поведение, просто выполняя один запрос на выборку на одном контроллере - устанавливая свойство размера пакета, вы просто намекаете на CoreData, который, по вашему мнению, является оптимальным размером пакета. CoreData будет обрабатывать выборку объектов в последовательных пакетах указанного размера по мере необходимости, а также будет отказывать управляемым объектам, когда это необходимо для потребления памяти.
Использование ЛЮБОЙ - довольно дорогая операция. Я не уверен насчет отношений, но вы могли бы попытаться получить вашу сущность тегов для конкретного имени тега, а не для вашей сущности объекта сообщения. Затем используйте обратную связь, чтобы получить объекты объекта сообщения.
Кроме того, вы используете компаратор, который, я уверен, не помогает. Дата должна храниться в основных данных в виде целого числа, чтобы вы могли просто выполнить прямую сортировку без использования селектора.
Базовые данные работают ОЧЕНЬ быстро, я провел поиск по ключевым словам в 65 000 записей и дал результаты в миллисекундах.
Удачи