2012-03-12 39 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