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