2016-06-14 2 views
0

이것은 이상한 문제이며 다른 해결 방법/버그 수정을 시도하고 있습니다. 그러나 나는 이것에 상당한 시간을 할애하여 누군가 새로운 눈으로이 문제의 근본 원인을 잠재적으로 발견 할 수 있기를 바랍니다.내 NSArray가 NSDictonaries의 수에 따라 반복되는 이유는 무엇입니까?

기본적으로 JSON 파일을 NSArray로 직렬화합니다. 이 데이터로 조작 할 필요가 있으므로 원본 NSArray의 NSMutableArray를 만듭니다.

그런 다음 NSDictonary를 만들고 objectForKey를 비교합니다.

그러나 Xcode 콘솔에서 NSLog 문을 통해 출력 할 때 Array가 사전의 수만큼 반복되는 것을 보았습니다. 왜 30 개의 사전으로 30 개의 배열을 인쇄 할 수 있습니까?

다음은이 문제와 관련된 몇 가지 코드입니다. 당신의 생각이 무엇이고이 문제를 개선하기 위해 내가 할 수있는 일을 알려주십시오.

self.objectsList = [[NSArray alloc] init]; 

[[HTTPServices instance] getConnectabilityObject:^(NSArray * _Nullable dataArray, NSString * _Nullable errorMessage) { 
    if (dataArray) { 
     NSMutableArray *array = [[NSMutableArray alloc] init]; 

     for (NSDictionary *dictonary in dataArray) { 
      ConnectabilityObject *object = [[ConnectabilityObject alloc] init]; 
      object.ConnectabilityTitle = [dictonary objectForKey:@"ConnectabilityObjectTitle"]; 
      object.ConnectabilityObjectType = [dictonary objectForKey:@"ConnectabilityObjectType"]; 
      object.ConnectabilityFullIPAddress = [dictonary objectForKey:@"ConnectabilityObjectFullIPAddress"]; 
      object.ConnectabilityObjectLastOctet = [dictonary objectForKey:@"ConnectabilityObjectLastOctet"]; 
      object.ConnectabilityObjectPortNumberOne = [dictonary objectForKey:@"ConnectabilityObjectPortNum1"]; 
      object.ConnectabilityObjectPortNumberTwo = [dictonary objectForKey:@"ConnectabilityObjectPortNum2"]; 
      object.ConnectabilityObjectPortNumberThree = [dictonary objectForKey:@"ConnectabilityObjectPortNum3"]; 

      [array addObject:object]; 
     } 
     self.objectsList = array; 
    } 
}]; 

UPDATE 여기

는 NSLogStatement하다이 배열 연관시킨다. 다른 방법으로이 데이터를 기록하고 있습니다. 이 방법은 아래에 있습니다.

-(void)pingResult:(NSNumber*)success { 
    NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist]; 
    for (NSDictionary *objectDictonary in objects) { 
     self.objectlist = nil; 
     NSLog(@"Another Method NSLog %@", objects); 
    } 

}

다음은 콘솔에서 NSLog입니다. 이 "Another Method NSLog"는 JSON 파일에있는 ConnectabilityObjects의 수와 같은 30 번 호출됩니다.

2016-06-14 11:28:55.724 FlightPath[3866:1176806] Another Method NSLog (
    "<ConnectabilityObject: 0x16695d80>", 
    "<ConnectabilityObject: 0x16696ad0>", 
    "<ConnectabilityObject: 0x16696b90>", 
    "<ConnectabilityObject: 0x16696be0>", 
    "<ConnectabilityObject: 0x16696c30>", 
    "<ConnectabilityObject: 0x16696ca0>", 
    "<ConnectabilityObject: 0x16696cf0>", 
    "<ConnectabilityObject: 0x165b14e0>", 
    "<ConnectabilityObject: 0x165b1530>", 
    "<ConnectabilityObject: 0x165b15c0>", 
    "<ConnectabilityObject: 0x165b1610>", 
    "<ConnectabilityObject: 0x165b1660>", 
    "<ConnectabilityObject: 0x165b16b0>", 
    "<ConnectabilityObject: 0x165b1700>", 
    "<ConnectabilityObject: 0x165b1750>", 
    "<ConnectabilityObject: 0x165b17a0>", 
    "<ConnectabilityObject: 0x165b17f0>", 
    "<ConnectabilityObject: 0x165b18b0>", 
    "<ConnectabilityObject: 0x165b1900>", 
    "<ConnectabilityObject: 0x16696d20>", 
    "<ConnectabilityObject: 0x16696d50>", 
    "<ConnectabilityObject: 0x16696da0>", 
    "<ConnectabilityObject: 0x16696df0>", 
    "<ConnectabilityObject: 0x16696e40>", 
    "<ConnectabilityObject: 0x16696e90>", 
    "<ConnectabilityObject: 0x16696ee0>", 
    "<ConnectabilityObject: 0x16696f30>", 
    "<ConnectabilityObject: 0x16696f80>", 
    "<ConnectabilityObject: 0x16696fd0>", 
    "<ConnectabilityObject: 0x166970e0>" 
) 
2016-06-14 11:28:55.729 FlightPath[3866:1176806] Another Method NSLog (
    "<ConnectabilityObject: 0x16695d80>", 
    "<ConnectabilityObject: 0x16696ad0>", 
    "<ConnectabilityObject: 0x16696b90>", 
    "<ConnectabilityObject: 0x16696be0>", 
    "<ConnectabilityObject: 0x16696c30>", 
    "<ConnectabilityObject: 0x16696ca0>", 
    "<ConnectabilityObject: 0x16696cf0>", 
    "<ConnectabilityObject: 0x165b14e0>", 
    "<ConnectabilityObject: 0x165b1530>", 
    "<ConnectabilityObject: 0x165b15c0>", 
    "<ConnectabilityObject: 0x165b1610>", 
    "<ConnectabilityObject: 0x165b1660>", 
    "<ConnectabilityObject: 0x165b16b0>", 
    "<ConnectabilityObject: 0x165b1700>", 
    "<ConnectabilityObject: 0x165b1750>", 
    "<ConnectabilityObject: 0x165b17a0>", 
    "<ConnectabilityObject: 0x165b17f0>", 
    "<ConnectabilityObject: 0x165b18b0>", 
    "<ConnectabilityObject: 0x165b1900>", 
    "<ConnectabilityObject: 0x16696d20>", 
    "<ConnectabilityObject: 0x16696d50>", 
    "<ConnectabilityObject: 0x16696da0>", 
    "<ConnectabilityObject: 0x16696df0>", 
    "<ConnectabilityObject: 0x16696e40>", 
    "<ConnectabilityObject: 0x16696e90>", 
    "<ConnectabilityObject: 0x16696ee0>", 
    "<ConnectabilityObject: 0x16696f30>", 
    "<ConnectabilityObject: 0x16696f80>", 
    "<ConnectabilityObject: 0x16696fd0>", 
    "<ConnectabilityObject: 0x166970e0>" 
) 
+1

명확하지 않습니다. 당신은 for 루프를 가지고 있고 당신의 코드는 컴파일되어서는 안된다.'[array addObject : object];''object'가 선언되지 않은 곳에서해야한다. – Larme

+4

놀라운 NSLog 출력에 관한 질문은 최소한 하나의 NSLog 문을 포함해야합니다. – danh

+0

@Larme처럼'ConnectableObject * object'가 범위에 포함되지 않기 때문에'[array addObject : object]'가이 코드를 기반으로 컴파일하면 안된다. 그 시점에서. – Wyatt

답변

1

넵. 그것은, 영업 코드가이 일을 한 첫 번째 시도에서

-(void)pingResult:(NSNumber*)success { 
    for (NSDictionary *objectDictonary in _objectlist) { 
     NSLog(@"%@", objectDictonary); 
    } 
} 

... NSLog의 실수 : 불필요 인스턴스 배열 var에 복사

NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist]; 

....

그리고 OP 코드가이 일을했다 : 위험 당신이 검사하려는 인스턴스 배열을 삭제

self.objectlist = nil; 

.... 혼란 출력을 생성

그리고는 영업 코드는이 일을 하였다 말한다

NSLog(@"Another Method NSLog %@", objects); 

가 ... "내 배열의 각 요소에 대해, 내 전체 배열 로그".

+0

감사합니다. 당신은 내 사고 과정을 촉발 시켰고 당신 말이 맞았습니다. 나는 당신의 대답을 정확하고 upvoted로 표시했습니다. 다시 감사합니다!! –