2012-11-01 4 views
1

수백 개의 고객 레코드를 탭으로 구분 된 파일에서 NSArrayController로 가져 오는 루틴을 작성하려고합니다.NSArrayController 이것이 작동하지 않는 이유는 무엇입니까?

이 내 초기 코드 :

NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path] 
           encoding:NSUTF8StringEncoding error:&error]; 
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"]; 
NSMutableDictionary *destDict = [[NSMutableDictionary alloc] init]; 

int i; 
for (i = 0; i <= [paragraphsArray count]-1; i++) { 
    NSString *currentParagraph = [paragraphsArray objectAtIndex:i]; 
    if ([currentParagraph length ] > 4) { 
     NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"]; 
     if ([elementsArray count] > 0) { 
      currentSerial++; 
      [destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial] 
         forKey:@"idSerial"]; 
      [destDict setObject:[elementsArray objectAtIndex:1] 
         forKey:@"destRazaoSocial"]; 
      [destDict setObject:[elementsArray objectAtIndex:2] 
         forKey:@"destLogradouro"]; 
      [destDict setObject:[elementsArray objectAtIndex:3] 
         forKey:@"destLogradouroNro"]; 
      /// repeat this for every field... 
      //Add the record: 
      [destArrayController addObject:destDict]; 
     } 
    } 
} 

이 코드는 내가 예를 들어 4 개 기록이있는 경우 기록이 잘못 삽입되도록, 삽입 된 네 개의 레코드가 마지막 레코드와 같은 내용이있을 것이다.

NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path] 
            encoding:NSUTF8StringEncoding error:&error]; 
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"]; 
int i; 
for (i = 0; i <= [paragraphsArray count]-1; i++) { 
    NSString *currentParagraph = [paragraphsArray objectAtIndex:i]; 
    if ([currentParagraph length ] > 4) { 
     NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"]; 
     if ([elementsArray count] > 0) { 
      NSMutableDictionary *destDict = [[NSMutableDictionary alloc] init]; 
      currentSerial++; 
      [destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial] 
         forKey:@"idSerial"]; 
      [destDict setObject:[elementsArray objectAtIndex:1] 
         forKey:@"destRazaoSocial"]; 
      [destDict setObject:[elementsArray objectAtIndex:2] 
         forKey:@"destLogradouro"]; 
      [destDict setObject:[elementsArray objectAtIndex:3] 
         forKey:@"destLogradouroNro"]; 
      /// repeat this for every field... 
      //Add the record: 
      [destArrayController addObject:destDict]; 
      [destDict release]; 
     } 
    } 
} 

이 작동하지만, 나에게 우아한 보이지 않는 : 나는이에 코드를 변경하는 경우

는하지만, destDict을 allocing 모든 루프를 부수고, 그것을 작동합니다. 나에게이 작업을 수행하는 올바른 방법을 알려 주시면 친절하십니까?

답변

1

게시 한 두 번째 방법으로 문제가 발생하지 않습니다. 다른 방법 (더 좋을 수도 있고 좋지 않을 수도 있음)은 첫 번째 방법이지만 destDict 대신 [destDict copy]를 배열에 추가하는 것입니다.

for 루프에 대한 또 다른 포인트 - 코드에서 사용하지 않는 인덱스를 사용할 필요가없는 경우 빠른 열거 형을 사용해야합니다. 더 빠르고 쉽게 작성할 수 있습니다. 그래서,이 :

int i; 
for (i = 0; i <= [paragraphsArray count]-1; i++) { 
    NSString *currentParagraph = [paragraphsArray objectAtIndex:i]; 

과 같이 수행 할 수 있습니다 (라는를위한 루프) : 작동하지 않는 첫 번째 코드는 당신의 NSMutableDictionary 외부를 만드는 것을 왜

for (NSString *currentParagraph in paragraphArray){ 
    .... 
    .... 
} 
1

이유 루프의 내용을 변경 한 다음 배열에 여러 번 추가합니다.

개체를 배열에 추가 할 때 개체의 실제 복사본이 만들어지지 않고 어레이는 단순히 해당 개체에 retain 메시지를 보냅니다. 첫 번째 코드 세그먼트에서 루프 외부에 destDict 인스턴스를 작성했기 때문에 동일한 destDict 인스턴스를 배열에 여러 번 추가하게됩니다. 동일한 인스턴스이기 때문에 사전은 마지막 루프에서 변경 한 내용을 효율적으로 가져옵니다.

두 번째 예와 같이 코드를 사용할 수 있지만 destDictalloc/init으로 생성하는 대신 [NSMutableDictionary dictionary]을 사용하여 자동 해제 된 인스턴스를 만듭니다. 그런 다음 어레이 컨트롤러에 추가 한 후 [destDict release]; 행을 추가 할 필요가 없습니다. (별거 아니지만 어쨌든) ...

NSString *stringFromFile = [NSString stringWithContentsOfFile:[fileURL path] 
           encoding:NSUTF8StringEncoding error:&error]; 
NSArray *paragraphsArray = [stringFromFile componentsSeparatedByString:@"\r"]; 
int i; 
for (i = 0; i <= [paragraphsArray count]-1; i++) { 
    NSString *currentParagraph = [paragraphsArray objectAtIndex:i]; 
    if ([currentParagraph length ] > 4) { 
     NSArray *elementsArray = [currentParagraph componentsSeparatedByString:@"\t"]; 
     if ([elementsArray count] > 0) { 

      NSMutableDictionary *destDict = [NSMutableDictionary dictionary]; 

      currentSerial++; 
      [destDict setObject:[NSString stringWithFormat:@"%ld",currentSerial] 
         forKey:@"idSerial"]; 
      [destDict setObject:[elementsArray objectAtIndex:1] 
         forKey:@"destRazaoSocial"]; 
      [destDict setObject:[elementsArray objectAtIndex:2] 
         forKey:@"destLogradouro"]; 
      [destDict setObject:[elementsArray objectAtIndex:3] 
         forKey:@"destLogradouroNro"]; 
      /// repeat this for every field... 
      //Add the record: 
      [destArrayController addObject:destDict]; 
     } 
    } 
} 
관련 문제