#objective-c #core-data #ios5 #iphone-4 #nsfetchedresultscontroller
#objective-c #core-данные #ios5 #iphone-4 #nsfetchedresultscontroller
Вопрос:
Сейчас у меня есть 5 контроллеров с извлеченными результатами, и я добавляю свой первый, который действительно работает с данными, а не просто отображает их. Я ожидаю, что контроллер будет управлять до 150 объектами. Какой размер пакета я должен выбрать для последовательной работы с до 5 объектами одновременно? Это 5?
- (NSFetchedResultsController *)estimatorEventsController
{
if (__estimatorEventsController != nil)
{
return __estimatorEventsController;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EstimatorEvent" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:36];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"epoch" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"EstimatorEvents"];
aFetchedResultsController.delegate = self;
self.estimatorEventsController = aFetchedResultsController;
NSError *error = nil;
if (![self.estimatorEventsController performFetch:amp;error])
{
NSLog(@"Unresolved error __remindersController %@, %@", error, [error userInfo]);
// abort();
}
return __estimatorEventsController;
}
Я ценю вашу помощь!
Ответ №1:
Алекс,
У меня более 800 элементов в моих контроллерах выбранных результатов, и я не выполняю пакетную выборку. Не беспокойтесь о 150 элементах… вы знаете, преждевременная оптимизация и все такое.
Еще одна вещь, которую следует помнить, это то, что ограничение пакета зависит от запроса на выборку, а не от контроллера полученных результатов. Это различие важно, потому что запрос на выборку является элементом более низкого уровня, который может легко вызвать массив результатов, содержащий тысячи элементов. Нужно быть осторожным с запросами такого размера. 150 строк — это просто не такая уж большая проблема.
Эндрю
Комментарии:
1. Вы имеете в виду, что вы не устанавливаете это свойство: [fetchRequest setFetchBatchSize:36];?
2. Алекс, если ваши 150 элементов не являются большими двоичными объектами, тогда просто получите их все. Самое маленькое устройство iOS когда-либо предоставляло вам 20 МБ рабочего пространства для запуска. Все устройства Mac OS X были больше. Один из секретов производительности CD заключается в том, чтобы загружать данные в оперативную память и выполнять там свои сложные запросы. Следовательно, ограничивайте количество компакт-дисков только тогда, когда вы знаете, что они не поместятся в оперативную память. Эндрю
Ответ №2:
У меня нет достаточно обоснованного ответа, но, похоже, в большинстве руководств предлагается загружать примерно в два-три раза больше ячеек, чем будет отображаться на экране одновременно, поэтому, если у вас одновременно отображается пять ячеек в таблице, то, возможно, 15? Это баланс между преимуществами не загружать все сразу, по сравнению с отсутствием слишком большого количества запросов на выборку, поскольку они имеют некоторую нагрузку и задержку, и убедиться, что у вас уже есть некоторые ячейки, которые еще не были предварительно выбраны на экране, чтобы реагировать при внезапной быстрой прокрутке.
Комментарии:
1. Аспект прокрутки довольно прост. Меня интересует аспект вычислений. Как бы я выбрал размер пакета для целей вычисления, а не просто прокрутки?