2010-08-18 39 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 
     } 

它是一個很好的辦法做到這一點的內存明智?