我首先要说的是,我真的很新(现在大约两天)到iPhone dev和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示例都实现了协议来处理执行请求的同一对象的响应。我不喜欢这个,因为在这种情况下,一个类可能需要各种相关的对象属性(可以异步获得)。
实现所需行为的最佳方法是什么,为其他程序员提供简单明了的界面,这些程序员将使用模型类来开发应用程序的其余部分?也许使用积木?
答案 0 :(得分:0)
嗯,据我所知,你的JSON响应中存在设计不规则性。看起来很复杂,只需要1-2小时的额外研究和1-2小时的额外编码。我的快速解决方案是更改模型视图,使其具有一致的值owner : "uri"
或owner : { ownerObjectProperty: value }
。
缓慢的解决方案是,您的映射对象中将有2个值。第一个是NSString *rawValueForOwner
,第二个是OwnerObject* ownerObject
。
您可以通过协议将owner
JSON值映射到rawValueForOwner
映射对象。解析值并扣除它是否以"{"
开头,然后通过RestKit手动解析方法将rawValueForOwner
解析为对象。如果它不是以"{"
开头,则再次调用您的RESTful服务器来获取对象,然后再次手动将beast
和owner
链接到彼此。
我会采取高手:)
此链接包含如何将JSON字符串解析为对象... Deserializing local NSString of JSON into objects via RestKit (no network download)