前言
這幾天陸續看了很多路由和中間件實現方案,比如JLRoutes、MGJRouter、HHRouter、CTMediator。
總結一下,無論是路由也好,中間件也好,主要的目的有兩個:
(1)功能模塊解耦,同時降低業務耦合度。
(2)滿足多樣化的app使用場景,比如在H5點擊某個鏈接可以跳轉到原生頁面。
(3)從app
外部點擊某個連接跳轉到app
內部某個功能場景。
移動端路由其實參照的是web端的路由實現方案。web端的路由實現方案,說白了,就是將路由地址和響應事件做一個關系映射,當客戶端訪問某個URL
時,系統就會調用這個URL
對應的響應方法。
以上就是路由的實現原理,其他的功能都是在其基礎之上做的擴展。
這里不再列舉這幾個路由/中間件的示例代碼了,有興趣的可以去github
下載這些項目看一看。
JXBRouter 這是我利用半天時間寫的一個iOS
路由解決方案,目前提供的功能較為簡單,只提供了根據路由進行相應跳轉的功能。
為什么已經有了這么多成熟的路由解決方案,我又寫了一個?
(1)出于興趣,正好這段時間也在研究關于web
的技術。
(2)JLRoutes
提供的功能很多很雜,讓人難以全面掌握,修改麻煩,甚至需要服務端提供支持。
(3)MGJRouter
的設計讓項目新人難以快速上手,成本高,代碼寫法略裝逼。
(4)CTMediator
是我個人比較喜歡的庫,在我們的項目中使用了CTMediator
中的部分代碼。
(5)以上幾個庫都解決了根據路由規則進行控制器的push
操作,但都忽視了回調操作(比如delegate
回調),我主要是想解決這個問題,順便什么時候有好的想法了再往項目里添加。
使用
1、無handler
注冊路由 & 帶參數
由ViewController
向BViewController跳轉
,在BViewController
中將通過路由拿到的param
數據展示在當前頁面上。
ViewController.m
- (IBAction)pushBClick:(UIButton *)sender {
[JXBRouter registerRoutePattern:@"demo://Amodule/mall/detail" targetControllerName:@"BViewController"];
[JXBRouter startRoute:@"demo://Amodule/mall/detail?info1=RouterDemo&info2=測試跳轉&info3=123456789"];
}
2、有handler
注冊路由
由BViewController
向CViewController
跳轉。
BViewController.m
- (void)btnClick1 {
[JXBRouter registerRoutePattern:@"demo://Amodule/product/list" targetControllerName:@"CViewController" handler:^(NSString *handlerTag, id parameters) {
if ([handlerTag isEqualToString:@"update"]) {
self.lbl1.text = [parameters valueForKey:@"editStr1"];
self.lbl2.text = [parameters valueForKey:@"editStr2"];
self.lbl3.text = [parameters valueForKey:@"editStr3"];
self.lbl1.textColor = [UIColor redColor];
self.lbl2.textColor = [UIColor redColor];
self.lbl3.textColor = [UIColor redColor];
}
}];
[JXBRouter startRoute:@"demo://Amodule/product/list?title=C控制器"];
}
在BViewController
中將CViewController
回調給BViewController
的數據展示在頁面上。
CViewController
的回調事件:
- (void)btnClick1 {
NSMutableDictionary *param = [NSMutableDictionary dictionary];
[param setValue:@"RouterDemo+editStr1" forKey:@"editStr1"];
[param setValue:@"測試跳轉+editStr2" forKey:@"editStr2"];
[param setValue:@"123456789+editStr3" forKey:@"editStr3"];
self.handlerBlock(@"update", param);
[self.navigationController popViewControllerAnimated:YES];
}
關鍵代碼是self.handlerBlock(@"update", param);
,這個handlerBlock
的第1個參數用于標記,作用是標識當前回調操作是哪一個,是增加數據還是刷新數據還是reload
頁面;第2個參數就是你要回調給其他頁面的數據。
未來會加入的功能
支持控件組件化
支持對象傳參
項目地址:JXBRouter傳送門,可以給個star表示鼓勵,項目還會不斷優化,歡迎Issue。
補充
推薦大家閱讀另一篇文章iOS組件通信方案,文章列舉了當下移動端通常采用的中間件方案。