iPhone4 iOS5 NSFetchedResultsController как выбрать размер пакета?

#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. Аспект прокрутки довольно прост. Меня интересует аспект вычислений. Как бы я выбрал размер пакета для целей вычисления, а не просто прокрутки?