2016-06-01 3 views
1

내 API 호출 중 하나에서 응답 객체로 고생하고 있습니다. 괜찮아요,하지만 개체 또는 countForKey 작업을 수행하려고하면 "인식 할 수없는 선택기 인스턴스로 보낸"오류가 발생합니다. 나는 응답 객체를 정확하게 디코딩하지 못한다고 느낀다. 어떤 입력이라도 크게 감사 할 것이다! API 호출에 대한응답 개체에서 작업을 수행 할 수 없습니까?

방법 :

- (void)callRegisterAccount:(NSString *)email 
        password:(NSString *)password 
      confirmPassword:(NSString *)confirmPassword 
      completionBlock:(void (^)(NSMutableArray *resultsArray))completion{ 

    NSLog(@"REGISTER ACCOUNT CALLED!"); 

    NSString *appendUrl = [NSString stringWithFormat:@"Account/Register"]; 

    NSURL *aUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@""%@", @"xxx", appendUrl]]; 
    NSLog(@"URL: %@",aUrl); 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:30.0]; 

    [request setHTTPMethod:@"POST"]; 

    [request addValue:@"application/json, text/plain, */*" forHTTPHeaderField:@"Accept"]; 
    [request addValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 

    //build an info object and convert to json 
    NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys: 
          email, 
          @"Email", 
          password, 
          @"Password", 
          confirmPassword, 
          @"ConfirmPassword", 
          nil]; 

    //convert object to data 
    NSError *error; 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info 
                 options:NSJSONWritingPrettyPrinted error:&error]; 

    NSString *strData = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",strData); 

    [request setHTTPBody:[strData dataUsingEncoding:NSUTF8StringEncoding]]; 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

           //                NSLog(@"REGISTER PUSH NOTIFICATIONS RESPONSE: %@", response); 
           //                NSLog(@"REGISTER PUSH NOTIFICATIONS ERROR: %@", error); 
           //                NSLog(@"REGISTER PUSH NOTIFICATIONS DATA: %@", data); 

           NSData *_data = data; 
           NSMutableString *_string = [NSMutableString stringWithString:@""]; 
           for (int i = 0; i < _data.length; i++) { 
            unsigned char _byte; 
            [_data getBytes:&_byte range:NSMakeRange(i, 1)]; 
            if (_byte >= 32 && _byte < 127) { 
             [_string appendFormat:@"%c", _byte]; 
            } else { 
             [_string appendFormat:@"[%d]", _byte]; 
            } 
           } 

           NSLog(@"REGISTER ACCOUNT RESPONSE: %@", _string); 

           if(_string) { 
            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
            completion((NSMutableArray*)_string); 
           } 
          }]; 
} 

응답 개체 :이 라인은 모든 잘못 enter image description here

답변

2

:

completion((NSMutableArray*)_string); 

_string 여기 NSMutableString의 인스턴스이고, 당신 ' 실제로 NSMutableArray의 인스턴스라는 것을 컴파일러에게 알리도록 지시합니다. 이것은 분명히 거짓말이며 어레이로 사용하려고하면 예외가 발생합니다.

JSON은 배열이나 사전이 될 수 있습니다. 예를 들어 실제로는 사전이므로이를 확인하고 배열을 반환하거나 완료 블록을 변경해야합니다. 이 컨테이너 유형 변형을 명시 적으로 처리해야합니다 ...

NSJSONSerialization을 사용하면 문자열 처리에 펑키 한 데이터를 사용할 필요가 없습니다. 데이터에서 JSON 객체로 곧바로 갈 수 있습니다 (사전 또는 배열), JSON에 문제가 있으면 오류를 반환합니다.

흠, 데이터 처리를 다시 보면 데이터의 형식이 약간 변경되었음을 알 수 있습니다. 약간 이상하지만 괜찮습니다. 당신이 그것을하고 당신의 문자열을 얻은 후에는 다시 데이터로 바꾸고 NSJSONSerialization을 사용해야합니다.

관련 문제