2010-08-18 59 views
5

我需要循环遍历Core Data中的所有实体,并使用NSFetchedresultcontroller。如何在我的应用程序中循环遍历nsfetchedresultcontroller

我正在做这样的时刻:

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

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

[tempArray release]; tempArray = nil; 

有没有更好的方式来做到这一点,而无需创建tempArray?

非常感谢

回答

11

取决于你想要做什么。如果你只是改变一个值,那么是的,有一个更简单的方法:

[[[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

对不起,我想答案是显而易见的:

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

它是一个很好的办法做到这一点的内存明智?