Пакетные результаты выборки базовых данных

Я выполняю запрос на выборку, который возвращает около 2000 объектов. В настоящее время это занимает около 20 секунд на моем устройстве. Поэтому я подумал, что мог бы установить предел выборки 100, а затем, когда пользователь прокручивает до конца табличного представления, получить следующие 100 объектов. Это может быть достигнуто с помощью NSFetchRequest'ssetFetchLimit а также 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 записей и дал результаты в миллисекундах.

Удачи

Другие вопросы по тегам