2011-12-09 4 views
3

저는 ios/RESTKIT를 처음 사용합니다. 내가 RESTKIT를 사용하여 ios 장치에서 webservice를 소비하려고합니다. json 수익은 2 가지 가능한 결과를 가질 수 있습니다. . 실패IOS - RESTKIT - 여러 방식으로 결과 매핑

A)는, JSON 결과는 결과가 문자열 "널 (null)"가능한 오류 코드)이다 (다음과 같습니다

{ 
    status: false, 
    result: null 
    error: NO_SUCH_USER 
} 

매핑 (A)

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[WsReturn class]]; 
    [mapping mapKeyPath:@"result" toAttribute:@"result"]; 
    [mapping mapKeyPath:@"status" toAttribute:@"status"]; 
    [mapping mapKeyPath:@"error" toAttribute:@"error"]; 
    [objectManager.mappingProvider setMapping:mapping forKeyPath:@"/"]; 
에 대한

B)성공이면 결과는 "복잡한 개체"입니다. 오류 코드는 null입니다.

(B)

RKObjectMapping* taskMapping = [RKObjectMapping mappingForClass:[Task class]]; 
    [taskMapping mapKeyPath:@"name" toAttribute:@"name"]; 
    [taskMapping mapKeyPath:@"taskId" toAttribute:@"taskId"]; 
    [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"]; 

RKObjectMapping* resultMapping = [RKObjectMapping mappingForClass:[Result class]]; 
    [resultMapping mapKeyPath:@"name" toAttribute:@"name"]; 
    [resultMapping mapRelationship:@"tasks" withMapping:taskMapping]; 
    [objectManager.mappingProvider setMapping:resultMapping forKeyPath:@"result"]; 

RKObjectMapping* cmplxMapng = [RKObjectMapping mappingForClass:[WsReturn class]]; 
    [cmplxMapng mapKeyPath:@"status" toAttribute:@"status"]; 
    [cmplxMapng mapKeyPath:@"error" toAttribute:@"error"]; 
    [cmplxMapng mapRelationship:@"result" withMapping:resultMapping]; 
    [objectManager.mappingProvider setMapping:cmplxMapng forKeyPath:@"/"]; 

질문

1) (A)에 대한

{ 
    status: true, 
    result: { 
     name: "Some User", 
     tasks: [ 
      { 
       name: "Some Task1", 
       taskId: 10 
      }, 
      { 
       name: "Some Task2", 
       taskId: 20 
      } 
     ] 
    }, 
    error: null 
} 

매핑 괜찮 작동한다. (B)는 그렇지 않습니다. 당신은 약간의 포인터를 제공 할 수 있습니까?

2) 동일한 webservice 호출의 경우 "result"부분은 문자열 (null) 또는 복합 객체 일 수 있습니다. 그렇다면이 코드를 어떻게 처리해야합니까? 어떤 매핑을 통과합니까? 매핑 또는 cmplxMapng (horozontal 스크롤을 피하기 위해 이름이 변경 되었습니까?)

[RKObjectManager sharedManager] loadObjectsAtResourcePath @ "/ myURL이"
objectMapping : HOW_TO_DECIDE_WHICH_MAPPING_TO_PASS_HERE 대리인 : 자기];

저는 이것이 일반적인 시나리오라고 생각합니다. 검색했지만 관련 예제를 찾을 수 없습니다. 어쩌면 내가 잘못된 곳을 들여다 보았을지도 모른다. 이것에 접근하는 방법에 관한 생각/조언이 도움이 될 것입니다. 감사. (통지 forKeyPath)

[objectManager.mappingProvider setMapping:uooMapping forKeyPath:@"result.tasks"]; 

2)이와

[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"];  

:

1)

내가이 줄을 교체 -

+0

내 답변이 도움이되는지 알려 주시고, 유용하다고 판단되면 동의 해 주시기 바랍니다. – john

+0

이 질문은 아직 공개 된 상태입니다. 모든 포인터가 도움이 될 것입니다. 감사! – Ravi

답변

5

그래서 이것은 내가 그것을 해결하는 방법입니다 이 스레드를 따라 갔다 http://groups.google.com/group/restkit/browse_thread/thread/89b25b3f0f7e0177 & Blake가 제안한대로이 줄을 추가했습니다 : 0

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
loadObjectsAtResourcePath

3) 다른 방법으로 개체를 매핑으로에 전화 전에, 나는 cmplxMapng을 전달하는 것은 항상 작동하는 것 같다 것으로 나타났다.

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"  
           objectMapping:cmplxMapng delegate:self]; 

는 그래서 "결과"부분은 다시, 나는 "(널)"수 "널 (null)은"결과 &은 "상태"& "오류"필드가 올바르게 매핑 된 문자열로 제공합니다. 공장!

희망이 있으면 도움이됩니다.