在这篇文章里,我主要说一下在Swift条件下的CTMediator的 使用。至于CTMediator的集成什么的都不说了。
CTMediator 广泛使用在 模块与模块之间的调用上,使得模块与模块的通讯更加便捷,耦合度更低。那么在同一个模块内要使用CTMediator 当然也是可以的,在这里我来做试验,就是在同一个模块内的。 不同模块内,使用的原理也是一样的。
如下图所示: 假如CTMediatorTest 就是我们的模块化的模块,我们在该模块内要有 push 出LHLoginViewController 的能力,这个时候需要注意如下两点 1、创建 CTMediator的类别。 在Swift中,类别创建好之后,并不是如上面展示的那样是 CTMediator+xxx的形势,只要创建一个类就好,在类中使用extention 去写类别,只是我们的oc习惯,使得生成的类名长这个样子 注意,这个类别 是用 public 修饰的 注意,这个类别 是用 public 修饰的 注意,这个类别 是用 public 修饰的 2、创建Action_xxx的类 这个类是我们的模块事件所在的类,可以有多个,一般我们一个模块定义一个。 注意: 该类一定是以 Action_ 开头的 注意: 该类一定是以 Action_ 开头的 注意: 该类一定是以 Action_ 开头的 注意:该类的 xxx 可以随意取名字,你想叫什么就叫什么,通常情况下,我们用模块名 作为xxx,当前在主工程中,可以 这样定义 Action_safari
如下图: 该类使用 @objc 修饰的,该类中的所有方法也是@objc修饰的,所定义的方法中 的参数parma 前面 有个_ 一般情况下,这个_是必须加上的,否则调用的时候方法不识别。
3、swift 中使用的注意事项
①、中间件是swift类型时必须添加 kCTMediatorParamsKeySwiftTargetModuleName 参数,value为中间类所在的组件名称,中间类是oc类型不加。 如果没有添加这个参数,那么在Mediator中无法找到目标类。
var tempParma = [
kCTMediatorParamsKeySwiftTargetModuleName:"safari"
] as [AnyHashable : Any]
value = safari 代表着我的主工程名称,在模块中为模块名称
②、CTMediator单利与中间件class类型不一致时,swift类中callback回调需要swift闭包与oc对象转换;
③、self.performTarget("second", action:.... second 代表着 Target_xxx 中的xxx 这个名字一定要相同
④、。。。。action: "LoginMoule_LHLoginController", par LoginMoule_LHLoginController代表着 方法名,如果在定义方法的时候 参数 parma 前面没有加 _ ,那么方法名就不应该这样写了,而应该写成 LoginMoule_LHLoginControllerWithParma
下面我把代码贴下面 Target_second 类
import UIKit
@objc class Target_second: NSObject {
@objc func Action_LoginMoule_LHLoginController(_ parma : [AnyHashable : Any]) -> UIViewController{
let login = LHLoginViewController.init()
if let callback = parma["callback"] as? (String) -> Void {
callback("ctmediator text")
}
login.userinfo = parma
return login
}
}
CTMediator+TabSecond 类
import Foundation
import CTMediator
import UIKit
public extension CTMediator{
func second_TestFunction(para: [AnyHashable : Any], callback:@escaping (String) -> Void) -> UIViewController{
var tempParma = [
kCTMediatorParamsKeySwiftTargetModuleName:"safari"
] as [AnyHashable : Any]
tempParma.merge(para) { (key, vaule) -> Any in
return key
}
tempParma.updateValue(callback, forKey: "callback")
let vc = self.performTarget("second", action: "LoginMoule_LHLoginController", params: tempParma, shouldCacheTarget: false) as? UIViewController ?? UIViewController.init()
return vc
}
}
调用 :
@IBAction func MediatorTestAction(_ sender: Any) {
let vc = CTMediator.sharedInstance().second_TestFunction(para: ["sdfas":"2334"]) { temp in
print("result ---- \(temp)")
}
vc.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(vc, animated: true)
}
|