Начну с того, что я действительно новичок (примерно два дня назад) в разработке 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, которые я видел, реализуют протокол для обработки ответа на тот же объект, который выполняет запрос. Мне это не нравится, потому что в этом случае одному классу могут потребоваться различные связанные свойства объекта (которые будут получены асинхронно).
Как лучше всего добиться желаемого поведения, предоставив простой и понятный интерфейс для других программистов, которые будут использовать классы модели для разработки остальной части приложения? Может с помощью блоков?