как пройти через nsfetchedresultcontroller - PullRequest
5 голосов
/ 18 августа 2010

в моем приложении мне нужно перебрать все мои сущности в Core Data, и я использую NSFetchedresultcontroller.

Я делаю это сейчас так:Есть ли лучший способ сделать это без создания tempArray?

Большое спасибо

Ответы [ 2 ]

11 голосов
/ 18 августа 2010

Зависит от того, что вы хотите сделать. Если вы просто меняете значение, тогда да, есть более простой способ:

[[[self fetchedResultsController] fetchedObjects] setValue:someValue forKey:@"someKey"]

Который будет проходить через все объекты, устанавливающие значение. Это стандартная операция KVC. Обратите внимание, что это расширит память, поскольку каждая сущность будет реализована во время мутации.

Если вам нужно сделать что-то гораздо более сложное с каждой сущностью или у вас возникла проблема с памятью, тогда все становится немного сложнее. ПРИМЕЧАНИЕ: не беспокойтесь о памяти до этапа оптимизации кодирования. Предварительная оптимизация проблем с памятью, особенно с Core Data, - пустая трата времени.

Концепция заключается в том, что вы будете перебирать каждую сущность и менять ее по мере необходимости. Кроме того, в определенный момент вы должны сохранить контекст, сбросить его, а затем слить локальный пул автоматического выпуска. Это уменьшит использование вашей памяти, так как вы вытолкнете объекты, которыми вы только что манипулировали, из памяти, прежде чем вы получите следующий пакет. Например:

NSManagedObjectContext *moc = ...;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSInteger drainCounter = 0;
for (id object in [[self fetchedResultsController] fetchedObjects]) {
  //Do your magic here
  ++drainCounter;
  if (drainCounter = 100) {
    BOOL success = [moc save:&error];
    NSError *error = nil;
    NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
    [moc reset];
    [pool drain], pool = nil;
    pool = [[NSAutoreleasePool alloc] init];
    drainCounter = 0;
  }
}

BOOL success = [moc save:&error];
NSError *error = nil;
NSAssert2(!success && error, @"Error saving moc: %@\n%@", [error localizedDescription], [error userInfo]);
[pool drain], pool = nil;

Это снизит использование памяти, но это дорого !! Вы попадаете на диск после каждых 100 объектов. Это следует использовать только после того, как вы подтвердили , что память является проблемой.

6 голосов
/ 18 августа 2010

Извините, я думаю, что ответ очевиден:

        for (MyClass *item in self.fetchedResultsController.fetchedObjects)
        {
            //do something
        }

Это хороший способ сделать это с памятью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...