Пакетная выборка основных данных

Я выполняю запрос выборки, который возвращает около 2000 объектов. В настоящее время это занимает около 20 секунд на моем устройстве. Поэтому я подумал, что могу установить предел выборки 100, а затем, когда пользователь прокручивает до конца представления таблицы, извлеките следующие 100 объектов. Это можно сделать с помощью NSFetchRequest's setFetchLimit и setFetchOffset.

однако я не могу понять, если на моей второй выборке, где я получаю объекты 101-200, что произойдет с объектами 1-100? Я бы используйте separate NSFetchedResultsController для каждых 100 элементов, а затем настроить методы источника данных представления таблицы для запроса на основе нескольких контроллеров результатов выборки? Или я могу как-то использовать то же самое NSFetchedResultsController чтобы каким-то образом получить 100 объектов за раз, но при каждой последующей выборке просто добавьте следующие 100 элементов к исходным 100 элементам?

Edit: вот мой код:

    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 будет обрабатывать выборку объектов в последовательных пакетах заданного размера по мере необходимости - и будет управлять ошибкой объекты, необходимые для потребления памяти.


использование любого-довольно дорогая операция. Я не уверен в отношениях, но вы можете попробовать получить объект tags для определенного имени тега, а не для объекта mesage. Затем используйте обратную связь, чтобы получить объекты объекта сообщения

также ваш вид использует компаратор, который, я уверен, не помогает делу. Дата должна храниться в core data как целое число, поэтому вы можете просто выполнить прямую сортировку без использования селектор.

Core Data очень быстро, я сделал поиск по ключевым словам через 65 000 записей и вернул результаты в миллисекундах.

хороший люк