JSONModel對架構的影響及解決方案

越來越多的項目使用CocoaPods,使用CocoaPods很有可能會用過JSONModel。

JSONModel是個很強大的庫,只要根據JSON定義好對應的類并繼承JSONModel,就可以把JSON字符串轉成該對象,而且對數據的轉換還有很強的兼容性,比如跨層解析。如下示例:

JSON字符串是這樣的:

{

"articleId":"12314",

"author":{

"name":"xiaofang",

"icon":"http://......"

}

}

類定義是這樣的:

@interface ArticleInfo : JSONModel

@property NSString *articleId;

@property NSString *authorName;

@property NSStirng *authorIconUrl;

@end

“articleId”解析自然沒問題,“authorName”和“authorIcon”就需要指定解析規則了,如下:

+ (JSONKeyMapper *)keyMapper

{

return [[JSONKeyMapper alloc] initWithDictionary:@{@"author.name": @"authorName", @"author.icon": @"authorIconUrl"}];

}

以上可以看出JSONModel是相當強大的,可以把服務器給的JSON數據直接解析成對象,當然前提是定義出相應的Model,這樣客戶端各層就能用這個Model了。

可是這里有個很大的局限性,大家可能遇到了只是當作理所當然了。情形如下:

需求(含各界面基本布局,UI基本上按這個布局設計)已出,但服務器接口未給出定義(服務器所有接口及數據已準備好只等客戶端開發的可能性幾乎為0),而且很可能服務器還沒人呢。客戶端能做的工作有哪些呢:

1、界面實現,StoryBoard或XIB或代碼實現

2、界面數據直接寫在StoryBoard或XIB上,或代碼里隨便寫點數據

3、其他

4、UI給切圖了隨時貼圖

遇到的問題是:

1、服務器沒給接口格式,沒法定義Model

2、沒Model,測試數據只能直接寫在界面上

3、沒服務器,客戶端無法測試

4、服務器給了數據格式,客戶端開發完畢后,跟服務器接口對接才發現,服務器并沒完全按先前給的數據格式開發。或者服務器感覺之前寫的數據格式不合理,又想改格式,直接導致客戶端改動較大(服務器寫接口的和寫數據庫的往往不是一個人)——Model得改,界面、數據存儲等用到Model的地方都得改

總之,客戶端開發嚴重依賴服務器,項目進度嚴重依賴服務器

解決辦法:需求已經出了,界面布局也出了,界面就可以實現了,這個沒什么疑問。重要的是:

1、Model也可以定義了,客戶端定義自己的Model就好了,管他服務器怎么定義呢,后期可以將服務器Model轉為客戶端Model呀(格式差異較大的話需要靈活處理)。

2、可以給Model定義一個方法用于生成測試數據以供界面顯示這些數據(假裝這些數據是服務器給的,^_^)(可以用rand()方法隨機從幾種數據中選,圖片url可以從網上弄貼這里)。

3、客戶端Model有了數據,所有工作都能進行了。

4、服務器數據格式和url給定后,能一一對應上的數據用JSONModel提供的辦法解決,不太對應上的,可以把服務器給的數據解析成.m文件中類的extension的屬性,然后覆蓋.h中屬性的get方法實現(Model的頭文件中的屬性是給客戶端其他模塊用的,.m文件中的屬性算是Model的私有屬性了,可以進行各種轉換)。這一步就實現了服務器Model到客戶端Model的轉換,只修改Model部分就可以了,不需要修改界面、數據存儲等其他模塊的代碼。

服務器Model轉客戶端Model,一般情況一下都比較容易處理,JSONModel本身就支持,另外一些特殊的,比如下面的情況:

1、iPhone界面,上面是一張大圖,下面是列表,所以客戶端定義的Model是倆屬性,一個大圖的對象數據,另一個是對應列表的數組數據。結果服務器只給了一個列表,列表第一個元素就是那個大圖數據,剩下的是列表。

Model頭文件中的屬性是給客戶端用的,即倆屬性。extension中只定義一個數組屬性用于接收服務器數據。然后Model實現中覆蓋頭文件中屬性的get方法(其實一般情況下,頭文件中的屬性定義為readonly即可,其他模塊一般不需要修改屬性)。頭文件中的大圖對象返回extension數組屬性的第一個元素,頭文件中的數組屬性返回extension數組屬性中除去第一個元素后的其他元素即可。

2、客戶端界面上定義了三張圖片,放在一起滾動顯示,其中第一張圖片是視頻截圖,就像AppStore中的app視頻和截圖那樣。客戶端Model定義為一個對象數據,其中有字段標識是視頻還是圖片。結果服務器給了倆列表,一個是視頻列表,一個是圖片列表。

也很簡單,依然是在.m中覆蓋頭文件中屬性的get方法,將倆服務器Model的倆數組合并即可。

總之,客戶端開發架構的思想,就是測試數據只集中在一個地方,而不是把測試數據直接寫在界面上。需求定義出來后客戶端首先要做的是架構,將數據寫在Model里(或者更進一步,網絡請求后設置Model的測試數據。網絡請求可以暫時請求百度首頁呀,服務器給了地址后改成相應的url就好了),界面、數據存儲等模塊的工作就能全面展開了。而不是簡單的照著需求做界面,然后干等服務器給數據。前期不會太緊,后面也比較輕松,后期只Model跟服務器對數據就可以了。

這些,算得上是比較好的項目解決方案吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容