Как реализовать простой интерфейс обратного вызова RestKit?

Начну с того, что я действительно новичок (примерно два дня назад) в разработке iPhone и Objective-C. Я все еще привыкаю к ​​синтаксису, управлению памятью и т.д.

Я пытаюсь использовать RestKit для взаимодействия с сервером, который разрешает запросы JSON REST. После выдачи GET-запроса я получаю данные вида:

GET : /api/beast/1/
{
    'species' : 'elephant',
    'resource_uri' : 'api/beasts/1/',
    'owner' : '/api/beastmaster/3/',
    'name' : 'Stampy'
}


GET : /api/beastmaster/3/
{
    'resource_uri' : '/api/beastmaster/3/'
    'first_name' : 'Bart',
    'last_name' : 'Simpson'
}

Дело в том, что свойство owner объектов beast иногда заполняется строкой URI ресурса и иногда фактическим полным JSON-представлением объекта, как показано ниже:

{
    'species' : 'elephant',
    'resource_uri' : 'api/beasts/1/',
    'owner' :     {
        'resource_uri' : '/api/beastmaster/3/'
        'first_name' : 'Bart',
        'last_name' : 'Simpson'
    },
    'name' : 'Stampy'
}

Что я хочу сделать, так это предоставить простой в использовании интерфейс для асинхронного запроса свойства owner, он должен проверить, имеет ли он уже полное представление объекта, и в этом случае немедленно выполнить обратный вызов или, если это не так, выдать соответствующий запрос GET и выполнить обратный вызов, когда придет ответ.

Если бы это был JavaScript, некоторые способы добиться этого могут быть следующими:

//Alternative 1
beast.getOwner(function(owner){
   console.log("Owner is: " + owner);
});

//Alternative 2
 beast.get("owner", {
     'success' : function(){...},
     'error' : function(){...}
});

Большинство примеров RestKit, которые я видел, реализуют протокол для обработки ответа на тот же объект, который выполняет запрос. Мне это не нравится, потому что в этом случае одному классу могут потребоваться различные связанные свойства объекта (которые будут получены асинхронно).

Как лучше всего добиться желаемого поведения, предоставив простой и понятный интерфейс для других программистов, которые будут использовать классы модели для разработки остальной части приложения? Может с помощью блоков?


person Juan Enrique Muñoz Zolotoochin    schedule 12.03.2012    source источник


Ответы (1)


Что ж, насколько я вижу из вашего ответа в формате JSON, в дизайне имело место несоответствие. Это кажется достаточно сложным, чтобы потратить 1-2 часа дополнительных исследований и 1-2 часа дополнительного кодирования только для этого. Мое быстрое решение состоит в том, чтобы изменить представление модели, чтобы оно имело постоянное значение, будь то owner : "uri" или owner : { ownerObjectProperty: value }.

Медленным решением было бы, если бы у вас было 2 значения в вашем сопоставленном объекте. 1-й будет NSString *rawValueForOwner, 2-й OwnerObject* ownerObject.

Вы должны сопоставить owner значение JSON с rawValueForOwner сопоставленным объектом через протоколы. Анализ значения и вычитание, если оно начинается с "{", а затем анализ этого rawValueForOwner в объект с помощью методов ручного анализа RestKit. Если он не начинается с "{", сделайте еще один вызов на ваш сервер RESTful, чтобы получить объект, а затем снова свяжите beast и owner друг с другом вручную.

Я бы выбрал высокий путь :)

Эта ссылка содержит, как преобразовать строку JSON в объект... Десериализация локальной строки NSString из JSON в объекты через RestKit (без загрузки по сети)

person Hayati Guvence    schedule 13.03.2012
comment
Это НЕ ТОЧНО, как я описал это. Данный URL-адрес всегда будет возвращать json в том же формате, дело в том, что он идет только на один уровень. Итак, если beastmaster имеет, скажем... свойство favoriteBeast. Тогда это представление beast покажет owner как URI. Но если объект верхнего уровня — это beast, то свойство owner будет полным объектом json. Это сделано для того, чтобы избежать бесконечных циклических ссылок на json. Кстати, спасибо за ссылку, это будет полезно. - person Juan Enrique Muñoz Zolotoochin; 13.03.2012