如何循环通过nsfetchedresultscontroller

如何循环通过nsfetchedresultscontroller

在我的应用程序中,我需要遍历核心数据中的所有实体,并且正在使用NSFetchedresultcontroller。

我现在正在这样做:

NSArray *tempArray = [[NSArray alloc] initWithArray:self.fetchedResultsController.fetchedObjects];

for (MyClass *item in tempArray)
{
    // do something
}

[tempArray release]; tempArray = nil;

还有没有创建tempArray的更好方法吗?

非常感谢

最佳答案

取决于您要做什么。如果您只是更改一个值,那么可以,有一种更简单的方法:

[[[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个对象就会命中磁盘。只有在确认内存是问题之后,才应使用此功能。

关于iphone - 如何循环通过nsfetchedresultscontroller,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3512872/

10-13 04:00