iOS中基於協議的路由設計
一、背景
前段時間對我們自己的App做了結構上的重構,拋棄了之前簡單的MVC開發模式,原因是隨著App的業務線越來越多,單個頁面的功能越來越複雜,MVC開發模式導致整個Controller-layer的程式碼越來越多。本文將分享重構中的Router模組。
使用路由模式可以解決我們專案中頁面與頁面之間的耦合(因為我們App是檢視生命週期作為驅動,所以這裡說是頁面,實際是控制器層),因為一個頁面功能太多就會引入過多的類,往往會造成import過多,不好管理。而且iOS中執行介面跳轉的時候,很容易產生模組間的耦合。
iOS執行介面跳轉的時候,程式碼如下:
[firstViewController.navigationController pushViewController:destinationViewController];
如果在firstViewController裡面直接引入標頭檔案就會導致模組間的耦合。我們這裡就需要路由模組去解決類似的問題。我們的設計是每個模組都有自己的路由管理,路由主要職責應該有:
-
管理模組內部跳轉。
-
宣告模組的對外介面
-
宣告模組的依賴
二、模組間的跳轉
這種設計是松耦合的,我們搜尋的模組可以隨時被相同功能的模組替換,這樣我們就實現了兩個模組的解耦。
目前路由的設計限於以下幾種:
-
字串標識對應介面,例如URL Router
-
利用Object-C特性,直接呼叫目的模組的方法
-
用protocol來和某個介面進行匹配
三、URL Router
目前絕大多數的路由是由字串來開啟某個頁面,程式碼大概如下:
//註冊某個頁面在路由的url地址 [URLRouter registURL:@“Desination” handler:^(NSDictionary * userDic){ }; //使用路由 [URLRouter openURL:@“app://***Module/Destionation”];
傳遞一串引數URL就可以進行頁面間的跳轉,這種方案可以再執行時隨時更改路由規則,指向不同的頁面,也可以支援多級頁面跳轉。這種方案有極大的靈活性。
而且此種方案最容易跨平臺實現的,iOS, Android,PC都可以按照URL來進行路由。
iOS中可以透過URL Scheme進行程式間的通訊,同App外面開啟App中的某個頁面,此方案可以完美相容URL Router。
當然這種方案缺點也是很明顯的:
第一、基於URL的設計只適合與UI介面,功能性的模組是不能採用這種方案的,所以這種方案只適用於檢視驅動的模組。
第二、這種方案維護比較困難,要維護一大批的字串,還要維護傳參。
第三、安全性不高,因為只有在執行時才能檢查出錯誤,類似於swift早期中selector用字串尋找的問題。
四、Protocol Router
這是我們採用的路由模式,程式碼如下:
id<***ServiceProtocol> service = [[ProtocolRouter shareInstance] findService:@protocol(***service)];
這種設計方案安全性比較高,在編譯階段就可以檢測出問題,更適合於swift的設計思想,任何模組都可以使用,包括功能模組,不僅僅侷限於UI模組。此種方案就會缺少相應的動態性,不過可以做一層URL Router的Adapter層專門用於動態性的需求。
基於Protocol的設計方案不會引起耦合,我們可以輕易替換掉相同功能的目的模組,這種方案也適用於各種解耦,例如Appdelegate的解耦。
以上就是我們在程式中實行元件化的一步,隨著App容量的增大,元件化是必不可少的一步,它可以讓我們的App更規範,模組的重用性更高。
作者:崔曉迪
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2651720/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於TCP協議的Socket網路程式設計( )TCP協議程式設計
- 基於TCP/UDP的Socket程式設計,HTTP/HTTPS協議TCPUDP程式設計HTTP協議
- ios 面向協議程式設計資源iOS協議程式設計
- iOS基於中間層的路由跳轉方案iOS路由
- iOS 工廠模式的面向協議程式設計思想iOS模式協議程式設計
- Swift中的面向協議程式設計Swift協議程式設計
- Swift 中的面向協議程式設計:是否優於物件導向程式設計?Swift協議程式設計物件
- Qt 基於QTcpSocket的ModbusTCP協議QTTCP協議
- 基於HTTP的功能追加協議HTTP協議
- 基於Netty實現自定義訊息通訊協議(協議設計及解析應用實戰)Netty協議
- 圖解路由協議!圖解路由協議
- iOS開發 - Mac下搭建基於rtmp協議的ngnix本地伺服器iOSMac協議伺服器
- 計算機網路之十:路由協議計算機網路路由協議
- STOMP協議——基於Websocket實現協議Web
- 網路協議之:基於UDP的高速資料傳輸協議UDT協議UDP
- 帶你瞭解動態路由協議OSPF基礎路由協議
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- 網路協議 6 - 路由協議:敢問路在何方?協議路由
- iOS開發- tableView的協議iOSView協議
- Linux中什麼是動態路由?動態路由協議有哪些?Linux路由協議
- 基於QUIC協議的HTTP/3正式釋出!UI協議HTTP
- BGP路由協議學習一路由協議
- OSPF 路由協議詳解(一)路由協議
- 指南:動態路由協議OSPF基礎,OSPF報文,LSA路由協議
- 關於 HTTP 協議中的 keep-aliveHTTP協議Keep-Alive
- 造輪子 | 如何設計一個面向協議的 iOS 網路請求庫協議iOS
- 基於應用理解的協議棧最佳化協議
- 基於Http協議的軟體自動升級HTTP協議
- tuic:基於QUIC協議的Rust高效能代理UI協議Rust
- Swift 面向協議程式設計的那些事Swift協議程式設計
- HCNA Routing&Switching之動態路由協議OSPF基礎(二)路由協議
- ??面試官:你會如何設計QQ中的網路協議?面試協議
- 遊戲開發—協議設計遊戲開發協議
- 淺析面向協議程式設計協議程式設計
- iOS上的CSS樣式協議 VKCssProtocoliOSCSS協議Protocol
- GRIT:eBay基於微服務的分散式事務協議微服務分散式協議
- 面向協議程式設計的一些思考協議程式設計
- CCNA - Part12 - 路由協議 (1) - 靜態路由,動態路由 RIP路由協議