KZWFoundation系列之Router的設(shè)計(jì)

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

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

- (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) {
        // 這里是處理無(wú)響應(yīng)請(qǐng)求的地方之一,這個(gè)demo做得比較簡(jiǎn)單,如果沒(méi)有可以響應(yīng)的target,就直接return了。實(shí)際開(kāi)發(fā)過(guò)程中是可以事先給一個(gè)固定的target專門用于在這個(gè)時(shí)候頂上,然后處理這種請(qǐng)求的
        [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對(duì)象
        actionString = [NSString stringWithFormat:@"Action_%@WithParams:", actionName];
        action = NSSelectorFromString(actionString);
        if ([target respondsToSelector:action]) {
            return [self safePerformAction:action target:target params:params];
        } else {
            // 這里是處理無(wú)響應(yīng)請(qǐng)求的地方,如果無(wú)響應(yīng),則嘗試調(diào)用對(duì)應(yīng)target的notFound方法統(tǒng)一處理
            SEL action = NSSelectorFromString(@"notFound:");
            if ([target respondsToSelector:action]) {
                return [self safePerformAction:action target:target params:params];
            } else {
                // 這里也是處理無(wú)響應(yīng)請(qǐng)求的地方,在notFound都沒(méi)有的時(shí)候,這個(gè)demo是直接return了。實(shí)際開(kāi)發(fā)過(guò)程中,可以用前面提到的固定的target頂上的。
                [self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params];
                [self.cachedTarget removeObjectForKey:targetClassString];
                return nil;
            }
        }
    }
}

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

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

但是在實(shí)際開(kāi)發(fā)過(guò)程中,不管是界面調(diào)用,組件間調(diào)用,在Mediator中需要定義很多方法。于是做作者又想出了建議我們用Category的方法,對(duì)Mediator的所有方法進(jìn)行拆分,這樣就就可以不會(huì)導(dǎo)致Mediator這個(gè)類過(guò)于龐大了。所以可以看下demo中的#import "CTMediator+CTMediatorModuleAActions.h"是怎么管理的。
代碼地址:https://github.com/casatwy/CTMediator
參考文章:https://lpd-ios.github.io/2017/02/26/iOS-Router/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 隨著用戶的需求越來(lái)越多,對(duì)App的用戶體驗(yàn)也變的要求越來(lái)越高。為了更好的應(yīng)對(duì)各種需求,開(kāi)發(fā)人員從軟件工程的角...
    一縷殤流化隱半邊冰霜閱讀 88,191評(píng)論 214 1,098
  • 原文鏈接:https://github.com/halfrost/Halfrost-Field/blob/mast...
    hament閱讀 5,832評(píng)論 1 31
  • iOS應(yīng)用架構(gòu)談 組件化方案 討論論壇 源 簡(jiǎn)述 前幾天的一個(gè)晚上在infoQ的微信群里,來(lái)自蘑菇街的Limboy...
    其實(shí)也沒(méi)有閱讀 1,548評(píng)論 1 9
  • 今天我去學(xué)畫(huà)畫(huà),老師說(shuō)讓我們畫(huà)一個(gè)在海邊的螃蟹也可以,一個(gè)熟的能吃的螃蟹也可以,因?yàn)槲野职趾臀业艿芏紣?ài)吃螃蟹,所以...
    悟空_07eb閱讀 133評(píng)論 0 0
  • ? 不要?jiǎng)儕Z自己和他人哭泣的權(quán)利 原創(chuàng)文 | 林子 (清風(fēng)浪港手寫鋪原創(chuàng)文,未經(jīng)授權(quán)請(qǐng)勿轉(zhuǎn)載) “寶寶乖,不哭哦,...
    清風(fēng)浪港手寫鋪閱讀 333評(píng)論 0 1

友情鏈接更多精彩內(nèi)容