日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

KZWFoudation系列之Router的设计

發(fā)布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KZWFoudation系列之Router的设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本來是要寫我自己用的router的,但是現(xiàn)在這個有點落后了, 所以這篇文章主要說下CTMediator這個router的設(shè)計,我覺得這個比較符合當(dāng)下我對router理解。

它主要有一個類CTMediator,里面有3個方法,performActionWithUrl,performTarget和releaseCachedTargetWithTargetName前2個的作用主要是返回controller,后一個是清除緩存。performActionWithUrl是根據(jù)url解析出所需要的數(shù)據(jù)在調(diào)用performTarget生成controller,下面來看下performTarget這個主要方法:

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget {NSString *targetClassString = [NSString stringWithFormat:@"Target_%@", targetName];NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];Class targetClass;NSObject *target = self.cachedTarget[targetClassString];if (target == nil) {targetClass = NSClassFromString(targetClassString);target = [[targetClass alloc] init];}SEL action = NSSelectorFromString(actionString);if (target == nil) {// 這里是處理無響應(yīng)請求的地方之一,這個demo做得比較簡單,如果沒有可以響應(yīng)的target,就直接return了。實際開發(fā)過程中是可以事先給一個固定的target專門用于在這個時候頂上,然后處理這種請求的[self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params];return nil;}if (shouldCacheTarget) {self.cachedTarget[targetClassString] = target;}if ([target respondsToSelector:action]) {return [self safePerformAction:action target:target params:params];} else {// 有可能target是Swift對象actionString = [NSString stringWithFormat:@"Action_%@WithParams:", actionName];action = NSSelectorFromString(actionString);if ([target respondsToSelector:action]) {return [self safePerformAction:action target:target params:params];} else {// 這里是處理無響應(yīng)請求的地方,如果無響應(yīng),則嘗試調(diào)用對應(yīng)target的notFound方法統(tǒng)一處理SEL action = NSSelectorFromString(@"notFound:");if ([target respondsToSelector:action]) {return [self safePerformAction:action target:target params:params];} else {// 這里也是處理無響應(yīng)請求的地方,在notFound都沒有的時候,這個demo是直接return了。實際開發(fā)過程中,可以用前面提到的固定的target頂上的。[self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params];[self.cachedTarget removeObjectForKey:targetClassString];return nil;}}} } 復(fù)制代碼

targetName就是調(diào)用接口的Object,actionName就是調(diào)用方法的SEL,params是參數(shù),shouldCacheTarget代表是否需要緩存,如果需要緩存就把target存起來,Key是targetClassString,Value是target。

通過這種方式進行改造的,外面調(diào)用的方法都很統(tǒng)一,都是調(diào)用performTarget: action: params: shouldCacheTarget:。第三個參數(shù)是一個字典,這個字典里面可以傳很多參數(shù),只要Key-Value寫好就可以了。處理錯誤的方式也統(tǒng)一在一個地方了,target沒有,或者是target無法響應(yīng)相應(yīng)的方法,都可以在Mediator這里進行統(tǒng)一出錯處理。

但是在實際開發(fā)過程中,不管是界面調(diào)用,組件間調(diào)用,在Mediator中需要定義很多方法。于是做作者又想出了建議我們用Category的方法,對Mediator的所有方法進行拆分,這樣就就可以不會導(dǎo)致Mediator這個類過于龐大了。所以可以看下demo中的#import "CTMediator+CTMediatorModuleAActions.h"是怎么管理的。

代碼地址:https://github.com/casatwy/CTMediator
參考文章:https://lpd-ios.github.io/2017/02/26/iOS-Router/

總結(jié)

以上是生活随笔為你收集整理的KZWFoudation系列之Router的设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。