2010-08-18 5 views
5

내 응용 프로그램 코어 데이터의 모든 엔티티를 통해 루프가 필요하며 NSFetchedresultroller를 사용하고 있습니다.nsfetchedresultroller를 통해 루프하는 방법

나는 순간에 이런 식으로 일을 해요 :

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 작업입니다. 이것은 각 개체가 돌연변이 중에 실현되기 때문에 메모리를 확장합니다.

각 엔티티와 관련된 작업을 수행해야하거나 메모리 문제가 발생하면 작업이 좀 복잡해집니다. 참고 : 코딩의 최적화 단계까지 메모리에 대해 걱정하지 마십시오. 메모리 문제, 특히 코어 데이터의 사전 최적화는 시간 낭비입니다.

개념은 각 엔티티를 반복하고 필요에 따라 변경한다는 개념입니다. 또한 특정 시점에서 컨텍스트를 저장하고 재설정 한 다음 로컬 자동 릴리스 풀을 비우십시오. . 이것은 당신의 다음 배치를 끌어 전에 방금 메모리가 다시 조작 개체를 밀어 것입니다 예를 들어 메모리 사용을 줄일 수 :

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 
     } 

가 메모리 현명한 그것을 할 수있는 좋은 방법이 있나요?

관련 문제