iOS開發(fā)中組件化之業(yè)務組件間通訊方式之Target-Action

既然是組件間通訊,這里所說的組件就是業(yè)務組件。

跳轉(zhuǎn)

實際就是控制器A跳轉(zhuǎn)到控制器B,控制器B作為某個組件的一個入口。
我們使用的方式是Target-Action,用到了一個三方CTMediator

0.組件化.png

看圖,為了簡化我們假設某個組件只有一個控制器SecondViewController。
要想不引入SecondViewController而跳到該控制器且可以傳值,我們還需要額外的兩個類CTMediator+TASecondVC和Target_TASecondVC。

CTMediator+TASecondVC(負責傳值和獲取目標控制器)

這是一個CTMediator的分類,我們在跳到SecondViewController的時候需要使用此分類的方法,它的方法是暴露給其他組件調(diào)用者的。

Target_TASecondVC(負責傳值和返回目標控制器)

這個類是CTMediator+TASecondVC需要用到的,它會返回我們要跳轉(zhuǎn)的VC以及傳值給該VC。這個類是不會暴露給其他組件調(diào)用者的。

使用

現(xiàn)在我們要跳轉(zhuǎn)到SecondViewController

   UIViewController * vc = [[CTMediator sharedInstance] secondVCWithName:@"我"];
    if (vc) {
        [self presentViewController:vc animated:YES completion:nil];
    }

代碼很簡單,并且沒有SecondViewController的出現(xiàn),其中的secondVCWithName方法是CTMediator+TASecondVC分類中的方法,參數(shù)是我們傳的值。
我們看下secondVCWithName:方法的具體實現(xiàn):

 - (UIViewController *)secondVCWithName:(NSString *)name{
    NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
    parameters[@"name"] = name;
    return [self performTarget:@"TASecondVC" action:@"SecondVC" params:parameters shouldCacheTarget:NO];
}

這個類雖然需要Target_TASecondVC的支持,但并沒有引入該類,而是通過調(diào)用CTMedia的方法實現(xiàn)的,CTMedia中使用runtime來實現(xiàn)找到某個類并調(diào)用這個類的某個方法。其調(diào)用的方法就是- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget。
performTarget后的參數(shù)是方法調(diào)用類,action后的參數(shù)該要要調(diào)用的方法。

看Target_TASecondVC的具體實現(xiàn)。

  - (UIViewController *)Action_SecondVC:(NSDictionary *)parameters{
SecondViewController * secondVC = [SecondViewController new];
secondVC.name = parameters[@"name"];
return secondVC;
}
注意:

你會發(fā)現(xiàn)target的參數(shù)是"TASecondVC",而我們的類名是Target_TASecondVC,action的參數(shù)是"SecondVC",而我們實際調(diào)用的方法名是Action_SecondVC。感覺類名少了"Target_",方法名少了·"Action_"這是因為CTMedia內(nèi)部為類名和方法加了這兩個前綴。

正向傳值

正向傳值就像我們前面介紹的直接把參數(shù)拼接在方法里就好了。

反向傳值

反向傳值我們需要利用到block回調(diào),將block作為方法的一個參數(shù)。
這里列出CTMedia分類的方法和Target_類的方法

  - (UIViewController *)thirdVCWithName:(NSString *)name callBack:(dispatch_block_t)callBack{
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
parameters[@"name"] = name;
parameters[@"callBack"] = callBack;
return [self performTarget:@"TAThirdVC" action:@"thirdVC" params:parameters shouldCacheTarget:NO];
}

  - (UIViewController *)Action_thirdVC:(NSDictionary *)parameters{
ThirdViewController * thirdVC = [ThirdViewController new];
thirdVC.name = parameters[@"name"];
thirdVC.callBack = parameters[@"callBack"];
return thirdVC;
}

問題

傳參的時候有硬編碼

附上一個小demo供大家參考:https://github.com/yangguanghei/Media-demo

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

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