如何实现一个简单的RestKit回调接口?

时间:2012-03-12 21:29:08

标签: objective-c ios restkit

我首先要说的是,我真的很新(现在大约两天)到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示例都实现了协议来处理执行请求的同一对象的响应。我不喜欢这个,因为在这种情况下,一个类可能需要各种相关的对象属性(可以异步获得)。

实现所需行为的最佳方法是什么,为其他程序员提供简单明了的界面,这些程序员将使用模型类来开发应用程序的其余部分?也许使用积木?

1 个答案:

答案 0 :(得分:0)

嗯,据我所知,你的JSON响应中存在设计不规则性。看起来很复杂,只需要1-2小时的额外研究和1-2小时的额外编码。我的快速解决方案是更改模型视图,使其具有一致的值owner : "uri"owner : { ownerObjectProperty: value }

缓慢的解决方案是,您的映射对象中将有2个值。第一个是NSString *rawValueForOwner,第二个是OwnerObject* ownerObject

您可以通过协议将owner JSON值映射到rawValueForOwner映射对象。解析值并扣除它是否以"{"开头,然后通过RestKit手动解析方法将rawValueForOwner解析为对象。如果它不是以"{"开头,则再次调用您的RESTful服务器来获取对象,然后再次手动将beastowner链接到彼此。

我会采取高手:)

此链接包含如何将JSON字符串解析为对象... Deserializing local NSString of JSON into objects via RestKit (no network download)