2012-03-12 54 views
0

我首先要说的是,我真的很新(大约两天)到iPhone dev和Objective-C。我仍然习惯的语法,内存管理等。如何实现一个简单的RestKit回调接口?

我想使用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' 
} 

的事情是beast对象的owner属性是有时人口与资源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

那么,据我所见,从你的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)

+0

,因为我已经将其形容它不完全。一个给定的URL将始终以相同的格式返回json,事情是它只能深入一层。所以如果一个“兽王”拥有,比如说......一个“最爱”的财产。然后,'beast'的_that_表示将'owner'显示为一个URI。但是,如果顶层对象是“野兽”,那么“所有者”属性将是完整的JSON对象。这是为了避免json上的无限循环引用。顺便说一句,感谢您的链接,这将是有益的。 – 2012-03-13 00:55:43

相关问题