Mediator用過的朋友都知道它的優(yōu)缺點袋狞,這篇文章我們來解決它存在的缺點
首先焚辅,我們列舉一下mediator存在的缺點:
1.每新增一個模塊,就要補充一個Category
2.模塊A
想要調(diào)用 模塊B
,模塊B需要暴漏需要調(diào)用的方法
3.參數(shù)硬編碼問題
4.命名規(guī)則并不美觀且相對復(fù)雜硕并,每個Target
都得加Target_A
,每個Action
都得加Action_
5.編譯時候沒有類型檢查法焰,運行的時候才能發(fā)現(xiàn)問題
這里我們提供NSObject+Mediator,解決上面的部分問題:
可以點擊查看demo
demo演示一個常用場景:tableView列表倔毙,我們希望通過傳參viewController埃仪、Cell、數(shù)據(jù)源data來封裝一個通用功能
[NSObject performTarget:<target>.classString action:<action> object:<cell> object:<viewController>];
這個方法封裝類(TableViewDemo)作為target陕赃,action方法也不需要暴漏出來卵蛉,這個方法主要用來傳參并返回對象
[obj performAction:<action> object:data];
刷新tableView數(shù)據(jù)源調(diào)用該方法
以上就是核心代碼,完美解決1么库、2傻丝、4問題,但是硬編碼問題似乎更嚴(yán)重了诉儒,這里的target和action都使用字符串葡缰,目前的解決思路是字符串映射+消息轉(zhuǎn)發(fā)(resolveClassMethod)去解決參考demo
最后的類型檢查是硬傷,畢竟Mediator的核心就是運行時忱反,這樣才不會產(chǎn)生依賴泛释。
此外說明一下:NSObject+Mediator如何使用
NSObject+Mediator可以調(diào)用絕大數(shù)方法:
比如我們要初始化一個labelUILabel *label = [UILabel performAction:@"new"]
比如自定義的類 CustomLabel繼承UILabel,UILabel *label = [NSObject performTarget:@"CustomLabel".classString action:@"new"]
其中字符串方法classString是用來區(qū)分實例方法和類方法的温算;
objects是參數(shù)大于2個時怜校,使用字典參數(shù),key從@“1”依次遞增
給一個關(guān)注支持一下注竿,謝謝
有問題可以給我留言