2011-12-09 2 views
3

Я новичок в ios/RESTKIT. Я пытаюсь использовать web-сервис с устройства ios, используя RESTKIT. Возвращение json может иметь 2 возможных результата.IOS - RESTKIT - результат сопоставления несколькими способами

A) На Отказ, результат JSON выглядит следующим образом (результатом является строка "нулевой" Код ошибки доступен):.

{ 
    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):

{ 
    status: true, 
    result: { 
     name: "Some User", 
     tasks: [ 
      { 
       name: "Some Task1", 
       taskId: 10 
      }, 
      { 
       name: "Some Task2", 
       taskId: 20 
      } 
     ] 
    }, 
    error: 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) работает нормально. (B) нет. Можете ли вы указать некоторые указатели?

2) Для одного и того же вызова веб-службы «результатом» может быть строка (null) или сложный объект. Итак, как мне обрабатывать это в коде? Какое отображение я могу пройти? сопоставление или cmplxMapng (имя изменено, чтобы избежать горизонтальной прокрутки)?

[[RKObjectManager sharedManager] loadObjectsAtResourcePath: @ "/ myUrl"
objectMapping: HOW_TO_DECIDE_WHICH_MAPPING_TO_PASS_HERE Делегат: само];

Я считаю, что это распространенный сценарий. Я искал, но не смог найти соответствующие примеры. Возможно, я искал не то место. Мысли/указатели о том, как подойти к этому, помогут. Благодарю.

+0

Сообщите мне, если мой ответ вам поможет или нет, а также, пожалуйста, примите, если это окажется полезным! – john

+0

Этот вопрос по-прежнему открыт. Любые указатели помогут. Благодаря! – Ravi

ответ

5

Так вот как я ее решил -

1) я заменил эту строку:

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

с этим: (уведомление forKeyPath)

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

2) Следующее за этой нитью http://groups.google.com/group/restkit/browse_thread/thread/89b25b3f0f7e0177 & добавил эту строку, как предложил Блейк:

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

просто перед тем вызов loadObjectsAtResourcePath

3) Что касается отображения объектов по-разному, я обнаружил, что прохождение cmplxMapng всегда, кажется, работает.

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

Так что, если «результат» часть возвращается как строка «нуль», я получаю «(нуль)» для результата & «статус» & поля «ошибка» отображающиеся правильно. Работает!

Надеюсь, это поможет кому-то.