IOS - RESTKIT - отображение результата несколькими способами - PullRequest
3 голосов
/ 09 декабря 2011

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

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) Вкл. Успех , это выглядит так (результат - «сложный объект». Код ошибки равен нулю):

{
    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) работает нормально.(Б) нет.Можете ли вы предоставить несколько указателей?

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

[[RKObjectManager sharedManager] loadObjectsAtResourcePath: @ "/ myUrl"
objectMapping: HOW_TO_DECIDE_WHTO_MAP:

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

1 Ответ

5 голосов
/ 14 декабря 2011

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

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

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

на это: (уведомление для KeyPath)

[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];

Таким образом, если часть «result» возвращается в виде строки «null», я получаю «(null)» для полей результата и «status» и «error», которые отображаются правильно.Работает!

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

...