[TOC]
模块管理器,用于模块间的通信和交互的基础工具
pod 'DPModuleManager', '~> 1.0.1'
DPModuleManager主要提供了两个类型来处理模块间的通信
- Module:模块的基类,每个模块应该实现一个Module的子类,DPModuleManager在启动时会自动加载Module的子类到内存中,用于模块间的通信
- ModuleManager:与其他模块通信的接口
DPModuleManager提供了以下几种方式来进行通信
- URL:模块间可以通过URL来定位并获取到对应的UIViewController对象,此方式为同步调用
- Service:模块间可以通过服务调用来处理相关的业务功能的调用,此方式为异步调用
调用方通过URL获取对应的UIViewController对象,这里的URL为指定的字符串,你可以随意指定,但是个人建议和页面路由对应
这里以模拟的问题详情页来进行举例,这里的必要参数questionID
,可以直接在URL中定义,也可以通过info
参数传递,这取决于提供页面的模块如果返回对应的UIViewController对象
guard let vc = ModuleManager.shared.viewController(withURL: "Question/Detail", info: ["questionID": "MyQuestionID"]) else {
return
}
// ...
除了可以通过ModuleManager来调用
viewController(withURL:, info:)
方法,也提供了Module中的便捷调用方法Module.bus.viewController(withURL:, info:)
在提供问题详情页的模块中,需要实现对应的Module的钩子方法
// Question模块
class QuestionModule: Module {
// 返回模块可以处理的URL
override var canHandleURLs: [String]? {
return [
"Question/Detail"
]
}
// 返回URL对应的ViewController
override func viewController(withURL url: String, info: [String : Any]?) -> UIViewController? {
// ...
if url == "Question/Detail", let questionID = info["questionID"] {
let questionDetailVC = QuestionDetailViewController(questionID: questionID)
return questionDetailVC
}
return nil
}
}
这里通过调用模拟的登录服务来举例
ModuleManager.shared.runService(withName: "User.SignIn",
info: ["account": "MyAccount",
"password": "MyPassword"]) { (callbackParams) in
// ...
}
服务调用是异步进行
然后在用户模块中,需要对服务调用进行处理
// 用户模块
class MyModule: Module {
// 返回模块可以处理服务名称
override var canHandleServiceNames: [String]? {
return ["User.SignIn"]
}
// 处理相关的服务调用
override func runService(withName serviceName: String, info: [String : Any]?, callback: @escaping ([String : Any]) -> Void) -> Bool {
if serviceName == "User.SignIn", let account = info["account"], let password = info["password"] {
// Sign In Handling ...
return true
}
return false
}
}
这里是实现Module子类的一般实现
// 集成自Module,模块会被自动加载
class MyModule: Module {
// 返回模块可以处理的URL
override var canHandleURLs: [String]? {
return ...
}
// 返回模块可以处理服务名称
override var canHandleServiceNames: [String]? {
return ...
}
// 返回URL对应的ViewController
override func viewController(withURL url: String, info: [String : Any]?) -> UIViewController? {
// ...
return nil
}
// 处理相关的服务调用
override func runService(withName serviceName: String, info: [String : Any]?, callback: @escaping ([String : Any]) -> Void) -> Bool {
// ...
return true
}
// 模块生命周期函数
override func willLoad() {
}
// 模块生命周期函数
override func didLoad() {
}
// 便捷的应用生命周期函数接口
override func applicationWillResignActive(_ application: UIApplication) {
}
}
此项目采用MIT开源协议,点击查看详情