亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > iOS > 正文

iOS使用核心的50行代碼擼一個(gè)路由組件

2019-10-21 18:39:42
字體:
供稿:網(wǎng)友

使用組件化是為了解耦處理,多個(gè)模塊之間通過協(xié)議進(jìn)行交互。而負(fù)責(zé)解析協(xié)議,找到目的控制器,或者是返回對(duì)象給調(diào)用者的這個(gè)組件就是路由組件。本文講解如何使用核心的50行代碼實(shí)現(xiàn)一個(gè)路由組件。

  • 組件化和路由

  • 路由的實(shí)現(xiàn)

路由注冊實(shí)現(xiàn)
路由使用實(shí)現(xiàn)

  • 客戶端的使用

  • 一些小想法

組件化和路由

之前看過挺多的關(guān)于路由管理、路由處理的文章,常常會(huì)和組件化出現(xiàn)在一起,一開始不知道為何路由和組件化出現(xiàn)在一起,后來公司的項(xiàng)目中使用了路由組件(他本身也是一個(gè)組件,確切的說是一個(gè)中間人或者中介者),才突然想明白了,原來如此。

使用組件化是為了解耦處理,多個(gè)模塊之間通過協(xié)議進(jìn)行交互。而負(fù)責(zé)解析協(xié)議,找到目的控制器,或者是返回對(duì)象給調(diào)用者的這個(gè)組件就是路由組件。

路由組件的職責(zé)主要是:

  • 給注冊者提供注冊接口

注冊者傳遞path和path對(duì)應(yīng)的block,block的具體實(shí)現(xiàn)又注冊者自己處理

  • 給調(diào)用者提供使用接口

調(diào)用者最簡單可以傳遞一個(gè)path給路由組件發(fā)起調(diào)用,路由組件會(huì)把具體的處理轉(zhuǎn)發(fā)給注冊者,理論上是可以任意的操作,包括頁面跳轉(zhuǎn)、彈窗提示、返回一個(gè)值給調(diào)用者等

下面會(huì)會(huì)在以上分析的基礎(chǔ)上實(shí)現(xiàn)一個(gè)簡單的路由組件,對(duì)應(yīng)的代碼可以在YTRouterDemo這里找到

路由的實(shí)現(xiàn)

路由的實(shí)現(xiàn)包括兩部分:路由注冊實(shí)現(xiàn)以及路由使用實(shí)現(xiàn)

路由注冊實(shí)現(xiàn)

路由注冊實(shí)現(xiàn)時(shí)序圖:

iOS,代碼,路由組件

如上圖所示,步驟很簡單:

  • 初始化一個(gè)YTRouterActionObject對(duì)象,用于保存path和對(duì)應(yīng)的blok
  • 獲取到路徑對(duì)應(yīng)的節(jié)點(diǎn),path會(huì)使用"/"符拆分為多個(gè)pathItem,每個(gè)pathItem都會(huì)保存在一個(gè)Dictionary對(duì)應(yīng)的位置上,subRouterMapWithPath負(fù)責(zé)深度遍歷Dictionary,然后找到對(duì)應(yīng)的位置
  • 把YTRouterActionObject對(duì)象保存在上一步找到的位置中

以上步驟對(duì)應(yīng)的代碼如下:

- (void)registerPath:(NSString *)path actionBlock:(RouterActionBlock)actionBlock { YTRouterActionObject *actionObject = [YTRouterActionObject new]; actionObject.path = path; actionObject.actionBlock = actionBlock; NSMutableDictionary *subRouter = [self subRouterMapWithPath:path]; subRouter[YTRouterActionObjectKey] = actionObject;}- (NSMutableDictionary *)subRouterMapWithPath:(NSString *)path { NSArray *components = [path componentsSeparatedByString:@"/"]; NSMutableDictionary *subRouter = self.routerMap; for (NSString *component in components) {  if (component.length == 0) {   continue;  }  if (!subRouter[component]) {   subRouter[component] = [NSMutableDictionary new];  }  subRouter = subRouter[component]; } return subRouter;}

在Demo中注冊的幾個(gè)路由最終的配置如下,比如home/messagelist對(duì)應(yīng)的路由配置保存在<YTRouterActionObject: 0x6040000365e0>對(duì)象中

Printing description of self->_routerMap:{ home =  {  "_" = "<YTRouterActionObject: 0x60c00003b040>";  messagelist =   {   "_" = "<YTRouterActionObject: 0x6040000365e0>";   detail =    {    "_" = "<YTRouterActionObject: 0x600000038ec0>";   };   getmessage =    {    "_" = "<YTRouterActionObject: 0x600000038e80>";   };  }; };}

路由使用實(shí)現(xiàn)

路由使用實(shí)現(xiàn)時(shí)序圖:

iOS,代碼,路由組件

如上圖所示,步驟很簡單:

從注冊的配置中找到匹配的YTRouterActionObject對(duì)象

執(zhí)行YTRouterActionObject對(duì)象的actionBlock,會(huì)傳遞一個(gè)YTRouterActionCallbackObject對(duì)象,如果調(diào)用者需要的是返回值,可以使用YTRouterActionCallbackObject對(duì)象的actionCallbackBlock傳遞一個(gè)返回值,這個(gè)actionBlock是又業(yè)務(wù)方的注冊者實(shí)現(xiàn)的

以上步驟對(duì)應(yīng)的代碼如下:

- (BOOL)runWithActionCallbackObject:(YTRouterActionCallbackObject *)actionCallbackObject { // 判斷是否支持scheme if (![self canAcceptScheme:actionCallbackObject.uri.scheme]) {  return NO; } // 獲取path對(duì)應(yīng)的ActionObject YTRouterActionObject *actionObject = [self actionObjectWithPath:actionCallbackObject.uri.path]; // 執(zhí)行Path注冊的對(duì)應(yīng)Block !actionObject.actionBlock ?: actionObject.actionBlock(actionCallbackObject); return YES;}- (YTRouterActionObject *)actionObjectWithPath:(NSString *)path { NSMutableDictionary *subRouter = [self subRouterMapWithPath:path]; return subRouter[YTRouterActionObjectKey];}

客戶端的使用

以上講到了核心的路由注冊實(shí)現(xiàn)和路由使用實(shí)現(xiàn),總共代碼還沒有50行,所以還是很簡單的,接下來會(huì)講下客戶端的使用步驟,包括

  • 客戶端注冊者注冊
  • 客戶端調(diào)用者使用

客戶端注冊者注冊

注冊的時(shí)機(jī)需要比較找,考慮到集成的方便,選擇在load方法中處理路由注冊,如下代碼所示,添加了幾個(gè)測試的路由,分兩種情況來說明下使用

1、不需要返回值

如下注冊"home/messagelist"的是一個(gè)頁面跳轉(zhuǎn)的路由,actionBlock的參數(shù)是一個(gè)YTRouterActionCallbackObject對(duì)象,可以從YTRouterActionCallbackObject對(duì)象或者到參數(shù),關(guān)于如何傳遞值,會(huì)在下面的客戶端調(diào)用者使用這里講到。然后在actionBlock處理目的頁面的初始化、參數(shù)設(shè)置等步驟,然后執(zhí)行頁面跳轉(zhuǎn)。

2、需要返回值

如下注冊"home/messagelist/getmessage"的是一個(gè)提供返回值的路由,同樣也可以從YTRouterActionCallbackObject對(duì)象獲取參數(shù),另外YTRouterActionCallbackObject對(duì)象還有一個(gè)actionCallbackBlock屬性是專門處理返回參數(shù)給調(diào)用者的,如下的代碼只是簡單返回一個(gè)字符串,在更加具體的業(yè)務(wù)場景中,這里會(huì)設(shè)置接口調(diào)用、數(shù)據(jù)庫查詢等任務(wù),最后把結(jié)果返回。

@implementation ModuleAUriRegister+ (void)load { [[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {  MessageListViewController *messageListVC = [MessageListViewController new];  NSString *title = callbackObject.uri.params[@"title"];  messageListVC.title = title;  [[UIViewController yt_currentViewControlloer].navigationController pushViewController:messageListVC animated:YES];; }]; [[YTRouterManager sharedRouterManager] registerPath:@"home/" actionBlock:^(YTRouterActionCallbackObject *callbackObject) { }]; [[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist/detail" actionBlock:^(YTRouterActionCallbackObject *callbackObject) { }]; [[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist/getmessage" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {  // 內(nèi)容回調(diào)  !callbackObject.actionCallbackBlock ?: callbackObject.actionCallbackBlock(@"message content text demo"); }];}@end

客戶端調(diào)用者使用

1、簡單的path跳轉(zhuǎn)調(diào)用

使用YTRouterManager單例對(duì)象的runWithPath方法,傳遞一個(gè)注冊的path參數(shù)完成跳轉(zhuǎn)。

[self addActionWithTitle:@"Router頁面跳轉(zhuǎn)" detailText:@"home/messagelist" callback:^{ [[YTRouterManager sharedRouterManager] runWithPath:@"home/messagelist"];}];

2、使用URL調(diào)用和有URL參數(shù)的調(diào)用

使用YTRouterManager單例對(duì)象的runWithURLString方法,傳遞一個(gè)完整的包含了scheme/path,或者有參數(shù)的會(huì)才有參數(shù)的URL,比如"YTRouter://home/messagelist" 和 "YTRouter://home/messagelist?title=Hello Message" ,路由組件會(huì)解析出里面的scheme、path、params,進(jìn)行scheme過濾處理、path查詢YTRouterActionObject對(duì)象處理、參數(shù)傳遞處理。

[self addActionWithTitle:@"Router使用URL調(diào)用" detailText:@"YTRouter://home/messagelist" callback:^{ [[YTRouterManager sharedRouterManager] runWithURLString:@"YTRouter://home/messagelist"];}];[self addActionWithTitle:@"Router使用帶參數(shù)的URL調(diào)用" detailText:@"YTRouter://home/messagelist?title=Hello Message" callback:^{ [[YTRouterManager sharedRouterManager] runWithURLString:@"YTRouter://home/messagelist?title=Hello Message"];}];

效果如下圖所示:

iOS,代碼,路由組件

效果圖

3、簡單的path跳轉(zhuǎn)調(diào)用

使用YTRouterManager單例對(duì)象的runWithActionCallbackObject方法,傳遞一個(gè)YTRouterActionCallbackObject類型的參數(shù),設(shè)置YTRouterActionCallbackObject對(duì)象的uri和結(jié)果回調(diào)actionCallbackBlock參數(shù),在actionCallbackBlock中處理返回值。

[self addActionWithTitle:@"Router獲取返回值" detailText:@"home/messagelist/getmessage" callback:^{ __block id message = nil; YTRouterActionCallbackObject *actionCallbackObject = [YTRouterActionCallbackObject new]; actionCallbackObject.uri = [[YTUri alloc] initWithPath:@"home/messagelist/getmessage"]; actionCallbackObject.actionCallbackBlock = ^(id result) {  message = result; }; [[YTRouterManager sharedRouterManager] runWithActionCallbackObject:actionCallbackObject];  NSLog(@"message = %@", message);}];

一些小想法

  • load方法中注冊path對(duì)性能有一定的影響,如果這里會(huì)成為性能瓶頸,考慮把這部分分代碼放在對(duì)象方法中初始化,比如主模塊發(fā)送消息給各個(gè)模塊,然后在各個(gè)模塊中處理注冊
  • YTRouterActionObject 如果需要更高的細(xì)嫩,可以考慮把path參數(shù)解析為components進(jìn)行緩存,這是一種以空間換時(shí)間的策略為了提高查找的效率,使用Dictionary而不是數(shù)組保存RouterActionObject
  • 為了提高查找的效率,使用Dictionary而不是數(shù)組保存RouterActionObject

總結(jié)

以上所述是小編給大家介紹的iOS使用核心的50行代碼擼一個(gè)路由組件,希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
免费无码国产精品| 操日韩av在线电影| 欧美日韩亚洲一区二区三区在线观看| 日本成人三级电影网站| 美女把尿口扒开给男人桶视频| 91麻豆视频网站| 亚洲欧美日韩小说| 樱花影视一区二区| av最新在线| 全网免费在线播放视频入口| 在线观看国产麻豆| 欧美在线播放高清精品| 国产网站一区二区三区| 99久久久精品免费观看国产| 亚洲国产中文字幕在线| 密臀av一区二区三区| 久久久久国色av免费看影院| 国产午夜精品福利视频| 欧美男男gaytwinkfreevideos| 久草视频在线资源站| 国产欧美精品日韩| 欧美日韩影视| 欧亚洲嫩模精品一区三区| 成人午夜在线视频| 婷婷国产成人久久精品激情| 欧美电影免费提供在线观看| 在线观看日韩视频| 久久国产精品免费精品3p| 亚洲国产成人精品久久久国产成人一区| 影音先锋男人资源站| 国产精品福利电影一区二区三区四区| 国产一级网站视频在线| 青青草原综合久久大伊人精品优势| 精品国模在线视频| 国产欧美日韩丝袜精品一区| 噜噜爱69成人精品| 亚洲国产剧情在线观看| 视频一区中文字幕精品| 亚洲第一区av| 亚洲精品在线三区| 中文字幕视频免费观看| 亚洲成人福利在线观看| 一区二区网站| 亚洲一区尤物| 91欧美国产| 国产精品女主播视频| av手机免费在线观看| 日韩aaaaa| 国产日产一区| 久热爱精品视频线路一| 成人动漫一区| 高清一区二区三区四区五区| 伊人久久中文字幕| 妖精视频一区二区三区免费观看| 日本一道高清亚洲日美韩| 精品综合久久久久久97| aa在线观看视频| 蜜桃视频日韩| 91免费国产视频| 欧美做爰性欧美大fennong| 99精品国产福利在线观看免费| 蜜臀精品久久久久久蜜臀| 日韩国产欧美一区二区| 俄罗斯毛片基地| 中文字幕在线观看第二页| 国产粉嫩一区二区三区在线观看| 国产性色一区二区| 18+视频在线观看| 亚洲女女做受ⅹxx高潮| 欧美精品久久一区二区三区| 国产香蕉97碰碰久久人人| 成人9ⅰ免费影视网站| 国产成人精品最新| 天堂中文在线资| 日韩一级电影| 尤物yw午夜国产精品视频| 欧美日韩激情在线| 国产精品青草久久| 91手机在线视频| 国产乱国产乱老熟| 五月天久久777| 国模大尺度私拍在线视频| 女人被狂躁到高潮的免费| 国产精品久久97| 色午夜这里只有精品| 91吃瓜网在线观看| 日本xxxx黄色| 香蕉自在线视频| 国产在线98福利播放视频| 中文字幕不卡三区视频| 精品176极品一区| 欧美一区二区大片| 69免费视频| 国产男女猛烈无遮挡91| 99国产超薄肉色丝袜交足的后果| 澳门黄色一级片| 欧美特级黄色片| 国产专区欧美精品| 亚州国产精品| 精品国产精品久久一区免费式| 色综合666| 久久精品免费观看| 成人免费观看49www在线观看| 先锋影音男人| 国产欧美啪啪| 欧美五级在线观看视频播放| 无遮挡亚洲一区| 色老板免费视频| 日p在线观看| 国产成人a视频高清在线观看| xxxxx中文字幕| 国产精品影音先锋| 黑巨人与欧美精品一区| 91精彩在线视频| av蓝导航精品导航| 一起操在线视频| 日韩不卡视频在线| 一本色道综合亚洲| 91日韩视频在线观看| 亚洲精品乱码久久久久久动漫| 国产精品久久久久久五月尺| 亚洲精品白浆| 亚洲国产另类 国产精品国产免费| 91久久精品美女高潮| 国产在线视频你懂得| 香蕉免费一区二区三区在线观看| 国产成人久久久久| 国产精品久久久久久久久果冻传媒| 欧美三级一区二区| 亚洲免费网站观看视频| 99久久综合网| 波多野结衣一二三四区| 一级一片免费视频| 免费在线一级片| 国产男女爽爽爽| 少妇太紧太爽又黄又硬又爽小说| 亚洲欧美欧美一区二区三区| 日本成人福利| 九色蝌蚪av新入口| 色综合色狠狠综合色| 亚洲精品久久久久久| 欧美怡红院视频| 肉色超薄丝袜脚交| 久久五月情影视| 日本中文字幕有码| 欧美剧在线免费观看网站| 美国三级日本三级久久99| 国产精品久久久久久久久久久久久久久久久久| 欧美日韩国内自拍| 免费成年人高清视频| jizz免费观看视频| 亚洲午夜久久久久久久久红桃| 丰满少妇高潮一区二区| 香港三日本8a三级少妇三级99| 99久久精品无码一区二区毛片| 57pao成人永久免费| 自己做鸭怎么接单寻找客源| 日韩在线麻豆| 国产成人一级片| 午夜精品成人av| 亚洲男同性视频| 李丽珍裸体午夜理伦片| 992kp快乐看片永久免费网址| 欧美色婷婷久久99精品红桃| 中文字幕一区二区三区四| a片在线免费观看| 99视频精品在线| 伊人久久久大香线蕉综合直播| 亚洲AV无码久久精品国产一区| 最新国产一区| 成人精品一区二区三区四区| 三年中国中文观看免费播放| 麻豆91免费| 奇米影视狠888| 久久久久久久久爱| 国产精品一卡二卡在线观看| 综合在线观看色| 欧美a级免费视频| 日韩亚洲成人av在线| 在线观看免费电影| 国产精品999在线观看| 国产 欧美 日本| 91在线视频18| 久久久影视传媒| 久久亚洲综合| 日韩电影免费观看在| 国产精品va在线播放| 午夜爽爽视频| 久久精品视频免费| 三级小说欧洲区亚洲区| 久久精视频免费在线久久完整在线看| 日韩av电影资源网| 亚洲成aⅴ人片久久青草影院| 欧美高清视频一区二区三区在线观看| 日韩成人网免费视频| 欧美色视频一区二区三区在线观看| 欧美激情视频免费看| 91在线无精精品白丝| 国产精品久久91| 性中国xxx极品hd| 国产视频一二三| 电影一区电影二区| 成年人国产在线观看| 国产日产欧美精品一区二区三区| 成人eeuss影院在线观看| 亚洲国产精品无码av| 亚洲v国产v欧美v久久久久久| 四虎国产精品永久在线| 男女高潮又爽又黄又无遮挡| 中文字幕在线观看不卡视频| 麻豆av在线免费观看| 亚洲欧美日韩综合一区| 中文字幕精品视频| 亚洲理论电影网| 国产日产精品一区二区三区四区| 国产毛片毛片| 日韩一区二区三区资源| 久久网站免费观看| 国产二区视频| 性网站在线免费观看| 精品二区视频| 中文字幕乱码久久午夜不卡| 18国产精品| 亚洲无亚洲人成网站77777| 这里只有视频精品| 国产精品久久久久久久久久久久久久久| 狠狠精品干练久久久无码中文字幕| 国产精品极品美女在线观看免费| 热久久99这里有精品| 九九视频精品在线观看| 日本vs亚洲vs韩国一区三区| 中文字幕一区不卡| 天天干天天草| av黄色在线网站| 日av在线播放中文不卡| 97成人精品区在线播放| 国产成人免费视频精品含羞草妖精| 国产在线精品一区| 国产毛片久久久久久国产毛片| 成人短视频app| 97**国产露脸精品国产| 久久av红桃一区二区小说| 午夜av一区二区三区| 天堂资源在线中文精品| 91一区二区视频| 亚洲美女视频在线观看| 精品电影在线| 成人ar影院免费观看视频| 欧美aⅴ一区二区三区视频| 色婷婷综合久久久久中文| 日韩精品三区四区| 99re国产在线播放| 91亚洲国产成人久久精品| 欧美丝袜激情| 亚洲69av| 91夜夜揉人人捏人人添红杏| 欧美一级黄色录像片| 欧美日韩五码| 99re6在线精品视频免费播放| 欧美在线免费看视频| 久久综合九色综合97_久久久| 香蕉久久久久久久| 91xxx视频| 国产专区在线播放| 在线视频国产日韩| 800av在线播放| 成人看片人aa| 中文字幕免费精品一区高清| 久久激情五月激情| 亚洲最大成人av| 国产不卡一卡2卡三卡4卡5卡在线| 色yeye免费人成网站在线观看| 视频一区视频二区中文| 进去里视频在线观看| 麻豆乱码国产一区二区三区| 91国内精品白嫩初高生| 天天好比中文综合网| 三级在线观看| 亚洲av无码乱码国产麻豆| 老司机精品免费视频| 成 年 人 黄 色 大 片大 全| 久久国产精品久久w女人spa| 亚洲熟女毛茸茸| 91在线短视频| 中文一区一区三区免费在线观看| 日本中文字幕在线视频观看| 色多多国产成人永久免费网站| 免费欧美一级片| 欧美 日韩 国产 成人 在线观看| 日本成本人片免费观看| 国产婷婷色一区二区三区| 国产欧美一区二区三区在线看| 欧美视频三区| 久久久久久久久久久一区| 在线观看欧美视频| 日韩欧美中文字幕精品| 国产成人在线观看网站| 蜜桃视频网站www| 欧美aa免费在线| 国产全是老熟女太爽了| 26uuu国产在线精品一区二区| 综合精品一区| 日本在线观看一区| 国产男女免费视频| 国产韩日影视精品| 国产成人8x视频一区二区| 国产欧美一区二区在线播放| 欧美亚洲系列| 秋霞网一区二区三区| 国产一区影院| 欧洲视频在线免费观看| 亚洲.欧美.日本.国产综合在线| 噜噜噜在线观看免费视频日韩| 国产精品久久久久久久久果冻传媒| 97精品久久人人爽人人爽| 国产精品一区三区在线观看| 亚州欧美一区三区三区在线| 一本一道久久久a久久久精品91| 一级做a爰片久久毛片美女图片| 欧美激情一级精品国产| 亚洲av成人精品一区二区三区| 在线观看国产精品网站| 亚洲国产精品久久91精品| 国产呦萝稀缺另类资源| 色av成人天堂桃色av| 亚洲嫩草精品久久| 波多野结衣久久高清免费| 中文字幕成在线观看|