2015-01-20 3 views
2

null 값 (JSON 응답)이 포함 된 내 서버에서 응답을 받으면 Null 값을 처리 할 때 RestKit 내부 매핑이 충돌합니다.Swift에서 RESTKIT을 사용하여 JSON에서 Null 매핑을 처리하는 방법

이 문제를 극복하는 방법은 무엇입니까?

"누락 된"메서드를 포함하도록 NSNull을 확장했지만이 방법이 제대로 작동하지 않았고 잘못되었습니다. 다음

내 매핑 및 오브젝트 코드와 restkit 출력입니다 :

객체 매핑 :

var tempmapping = RKObjectMapping(forClass: PRLAUser.classForCoder()) 
     tempmapping.addAttributeMappingsFromDictionary([ 
      "firstName" : "firstName", 
      "secondName" : "lastName", 
      "email" : "email", 
      "id" : "prlaToken" 

      ]) 

오브젝트 코드 - 잘 적어도 매핑되고있는 변수 :

var email : String? 
var firstName : String? 
var lastName : String? 


var prlaToken : String? 

오류 로그 :

Parola[6138:3119821] -[NSNull length]: unrecognized selector sent to instance 0x197b86ba0 

2015-01-20 15 : 53 : 37.973 Parola [6138 : 3119821] * 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 응용 프로그램 종료 중 - 이유 : '[NSNull 길이] : 인스턴스에 전송 된 인식 할 수없는 선택기 0x197b86ba0' * 첫 번째 호출 스택을 굴림 : (0x1867fa59c 0x196f040e4 0x186801664 0x1867fe418 0x186702b6c 0x100707964 0x100023dc8 0x187605b10 0x1000a34a0 0x1000a4078 0x1000a99d4 0x1000a8dfc 0x10009a8f4 0x1000995a8 0x10009bbb4 0x10009c294 0x10009ca84 0x1875f461c 0x1000e4754 0x1000e2acc 0x1875f461c 0x1876b626c 0x1007b4df0 0x1007bf854 0x1007b8120 0x1007c175c 0x1007c2f18 0x1977252e4 0x197724fa8) 의 libC++ abi.dylib : 형 캐치되지 제외 종결 NSException

어시스턴트 문제에 관해서.

+0

http : // stackoverflow를 참조하십시오.co.kr/a/16610117/1633251 –

+0

이 게시물을 더 일찍 보았습니다. 이 게시물은 이러한 호출을 피하기 위해 NSNull 확장을 제안합니다. 이 전화는 문제가되지 않습니다. 문제는 그들이 전화를받는 이유입니다. – user1666216

+0

JSON이 어떤면에서 Swift와 같은지 생각해보십시오. 당신은 "foo"의 키와 "bar"의 값을 가진 사전을 가질 수 있으며, 값은 nil이 될 수 있습니다. Nil은 완전히 합법적이며 JSON에서 기본 변환으로 [NSNull null]을 자리 표시 자로 삽입합니다. 변환 된 JSON을 처리하는 한 가지 방법은 각 값, 즉 [NSNull null]에 대한 모든 문자열, 숫자, 배열 또는 사전을 테스트하고 처리하는 것입니다. 나는 그것을 시도하고 점점 더 복잡 해졌다. 다른 해결책은 NSNull에서 일반적인 메시지를받을 때 어떤 식 으로든 정상적으로 돌아 오는 것입니다. 따라서 위의 솔루션입니다. –

답변

2

버전 0.23.1이 유용 할 것입니다. 임시 수정으로 RestKit github 페이지에 문제를 게시했습니다. 나는 또한 NO 위임에 돌아 RKMappingOperationDataSource을 변경할 수 있습니다이

public override func validateValue(ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKeyPath inKeyPath: String, error outError: NSErrorPointer) -> Bool { 
    if let memory = ioValue.memory { 
     if inKeyPath == "hint" && ioValue.memory is NSNull { 
      ioValue.memory = nil 
      return true 
     } 
    } 
    return super.validateValue(ioValue, forKeyPath: inKeyPath, error: outError) 
} 

같은 짓을

- (BOOL)mappingOperationShouldSetUnchangedValues:(RKMappingOperation *)mappingOperation;

을 요청할 때 문자열로 NSNull을 받고있다 객체에서

https://github.com/RestKit/RestKit/issues/2155

BTW. 이 질문은 스택에 이미 있습니다. RestKit JSON null value crash

+0

결국, 그것은 아마도 지금까지 수정 된 RestKit의 버그였습니다. 이 버그를 해결하기 위해 restkit 버전에 1 줄의 코드를 추가했지만 기회가 없어서 빠른 옵션을 처리하기 위해 완전히 업데이트되지 않은 제 3 자 라이브러리를 선택하지 않았기 때문에 결국에는 RestKit을 사용하지 않았습니다. – user1666216

+0

RestKit에서 버그를 발견하지 못했습니다. 소스를 확인하고 커밋과 변경 사항을 발견하여이 "버그"를 만들었습니다. 그러나 그들은 단지 속성의 유효성을 검사하는 내부 사과 API에 의존합니다 (그래서이 validateValue). Objc에서이 코드를 실행하면 NSNull이 NSString과 일치하지 않는다고 말할 것입니다. 그러나 Swift에서는 그것을 말할 것입니다 ... 왜이 "hack"을'validateValue'로 할 것입니다. : / –

0

서버에서 널 값을 보내면 먼저 그 의미를 결정해야합니다. 예를 들어 사전에 문자열이있을 것으로 예상되는 경우 키가 없거나 값이 null이거나 값이 빈 문자열 일 수 있으며 이러한 사례를 동일하게 취급할지 여부를 결정해야합니다 . JSON 데이터를 설계 한 사람은 사실 null 값을 다르게 처리해야 할 수도 있습니다.

그 다음에 직설적 인 것은 if (object == (id) [NSNull null])를 비교하여 null 값을 확인하거나 NSDictionary에 검사를 수행하는 범주를 추가하여 값을 반환합니다. 필요.

+0

물론. 그러나 구문 분석을 직접 처리하지 않는 restkit이 있습니다. 문제는 restkit이 문자열 변수를 nsnull로 설정하려고한다는 것입니다. 신속한 객체는 nsnull로 인식 될 수 있으며, 선택적인 신속한 값입니다. 그래서 objectove c 코드는 나중에 swift 변수가 문자열이고 그것이 길이라는 메시지를 보내려고한다고 가정합니다. – user1666216