IMSDK封裝<三>
XMPP Framework是一個百寶箱,Robbie Hanson 是一個怪獸級別的程式設計師。
訊息與業務物件的互相轉化是一個累活
我們基於XMPP Framework做業務封裝,我們必須要處理業務物件和訊息的互相轉化。我們自定義的協議為每一種訊息擴充了不同的節點(XML),這其中,有兩種訊息我們共用一個節點,因此,這個節點裡的資訊的差異,我們都要解析,另外在單聊和群聊的基礎上我們還劃分了一個討論組型別,but 這個討論組型別並不像chat和groupchat那麼容易得到,它又隱藏在一個單獨的擴充節點裡面用bool值去區分,因此這種轉化是一個疲累的活。
讓我們學習Robbie Hanson,如何處理累活
直接面對協議,一個節點一個節點的轉,是繁瑣不堪的。我們面對的問題是如何將我們自定義的協議,用oc物件的方式去處理。就像json轉model,熟以習常的面向模型去開發。其實這種思路轉換並不容易,程式設計師容易只見樹木不見森林,很難跳出自己的安全區。XMPP框架就是實現協議的程式碼,Robbie Hanson是一個傑出的程式設計師,讓我們學習他的處理方式。XMPP協議是基於XML格式便籤來傳遞資訊,在官方協議裡面最常見的是三個標籤節點,分別為<message></message>、<iq></iq>、<present></present>
. Robbie Hanson針對這三種協議設計了三個類。我們可以在Framework的core找到。
XMPPElement
XMPPMessage
XMPPIQ
XMPPPresent
其中XMPPElement
是他們的基類。讓我們體會下面的這種對比。
<message type="chat" to="xiaoming@example.com">
<body>Hello World!<body />
<message />
讓我們來看結點的對應類的對映
@interface XMPPMessage XMPPElement
...
- (NSString *)type;
- (NSString *)subject;
- (NSString *)body;Hello World!
- (NSString *)bodyForLanguage:(NSString *)language;
- (NSString *)thread;
...
@end
現在,我們獲取某個節點的值,完全是物件導向,雖然NSXMLElement也是物件,但是XMPPMessage更加面向模型。例如,獲取type、body,我們直接
message.type 或者 [message type]
message.body 或者 [message body]
有了這樣的對比,我們頓時就清楚了。比如我們為我們的訊息型別擴充了一個location節點
<location xmlns = “xxxx”>
<longitude> xxx </longitude>
<latitude>xxx </latitude>
<adress> xxx </adress>
....
</location>
那麼我們可以這樣用類來描述
@interface LocationElement : XMPPElement
@property (nonatomic, copy) NSString *longitude;
@property (nonatomic, copy) NSString *latitude;
@property (nonatomic, copy) NSString *city;
@end
即使我們自定義的節點,攜帶的資訊非常多,我們也可以從容的去處理。
最後我們為XMPPMessage類,增加了一個分類,方便從XMPPMessage獲取我們自定義的子節點
@interface XMPPMessage (SETransfer)
- (BOOL)isMessageWithFile;
- (FileInfoElement*)fileInfoElement;
....
- (BOOL)isMessageWithLocation;
- (LocationInfoElement*)locationInfoElement;
....
@end
當然,我們對業務物件,也做了類似的處理。這樣我們就比較容易的完成了訊息與業務物件互相轉化的累活。
補充: 我們運用runtime,動態的業務物件新增了方法。
相關文章
- IMSDK封裝<二>封裝
- IMSDK封裝<一>封裝
- Java(三)封裝Java封裝
- java三大特性-封裝Java封裝
- 物件導向 -- 三大特性之封裝物件封裝
- 作業三--測試與封裝 5.1封裝
- 【封裝那些事】 缺失封裝封裝
- 封裝封裝
- Java的三大特性:封裝、繼承、多型Java封裝繼承多型
- java物件導向的三大特徵之封裝Java物件特徵封裝
- java-三大特性之一封裝性Java封裝
- 【封裝小技巧】is 系列方法的封裝封裝
- 【JavaScript框架封裝】公共框架的封裝JavaScript框架封裝
- Sqlite封裝1-基本封裝-SqliteToolSQLite封裝
- 物件導向三大特性-----封裝、繼承、多型物件封裝繼承多型
- 物件導向三大特徵(封裝/繼承/多型)物件特徵封裝繼承多型
- [ 造輪子 ] 手動封裝 AJAX (三) —— 最終版封裝
- 第三次作業-封裝測試感悟封裝
- 用儲存過程封裝awrrpt指令碼(三)儲存過程封裝指令碼
- 演算法的封裝與切換——策略模式(三)演算法封裝模式
- Flutter 封裝:富文字 RichText 極簡封裝Flutter封裝
- Dapper的封裝、二次封裝、官方擴充套件包封裝,以及ADO.NET原生封裝APP封裝套件
- AVPlayer封裝封裝
- ajax 封裝封裝
- 封裝OCX封裝
- 封裝介面封裝
- sqlite封裝SQLite封裝
- java封裝Java封裝
- java 封裝Java封裝
- EventBus封裝封裝
- FMDB封裝封裝
- websocket封裝Web封裝
- 5.1封裝封裝
- 09 #### 封裝封裝
- 專案常用JS方法封裝(三) [ 字串相關處理 ]JS封裝字串
- QT常用控制元件(三)——自定義控制元件封裝QT控制元件封裝
- 前後端資料互動(三)——ajax 封裝及呼叫後端封裝
- 淺談python的物件的三大特性之封裝Python物件封裝