DispatchCenter
DispatchCenter 尝试解决的问题是什么?
当应用程序变得越来越复杂时,会大量依赖业务模块,如下所示
采用 DispatchCenter 架构,我们希望实现明确的模块职责和边界,提高代码质量,减少复杂依赖,提高开发效率,并便于问题定位,如下所示:
特性
- 使用泛型或 URL 进行服务注册
- 支持使用复杂参数解析服务
- 支持 URL 查询参数
- 支持引用和值类型
- 支持 push/present/show/showdetail 导航
- 支持使用 URL 或 ViewController 进行导航
要求
- iOS 9.0+ / tvOS 9.0+
- Xcode 12 +
- Swift 5.0 +
安装
pod 'DispatchCenter', '~> 1.2.0'
使用
注册
// register your service provider
class CourseViewController: UIViewController {
var id: Int?
}
extension CourseViewController: ServiceProviderProtocol {
static func create(_ arguments: [String: Any]? = nil) -> Self {
let courseVC = CourseViewController.init(nibName: "CourseViewController", bundle: nil) as! Self
return courseVC
}
}
// register process with Type
let container = ServiceManager()
// without parameter
container.register(CourseViewController.self) { (_) -> CourseViewController in
let course = CourseViewController.create()
return course
}
// with parameter
container.register(CourseViewController.self) { (_, id: Int) -> CourseViewController in
let course = CourseViewController.create(["id": id])
return course
}
解析
let container = ServiceManager()
// without parameter
let course = container.resolve(CourseViewController.self)!
self.showViewController(course, from: self)
// without parameter
let course = container.resolve(CourseViewController.self)!
self.showViewController(course, from: self)
将URL映射到ViewController
// register process with URL
class LessonViewController: UIViewController {
var id: Int?
}
extension LessonViewController: ServiceProviderProtocol {
static func create(_ arguments: [String : Any]? = nil) -> Self {
let lesson = LessonViewController(nibName: "LessonViewController", bundle: nil) as! Self
guard let id = arguments?["id"] as? Int else {
return lesson
}
lesson.id = id
return lesson
}
}
// url with query parameters
let url= "dispatch://course/lesson"
container.register(url: url) { (_, parameter: [String: String]?) -> LessonViewController in
var arguments: [String: Any] = [:]
if let idstr = parameter?["id"], let id = Int(idstr) {
arguments["id"] = id
}
let course = LessonViewController.create(arguments)
return
}
let resolveURL = "dispatch://course/lesson?id=1"
let lesson = container.openURL(url: resolveURL)
self.showViewController(lesson, sender: nil)
导航器
DispatchCenter支持通过符合NavigatorType协议进行导航。请参阅以下代码
// define a RouteManager and confirm NavigatorType protocol
// register url
// navigate with url
let url= "dispatch://course/lesson"
final class RouteManager: NavigatorType {
static let `default` = RouteManager()
private let container = ServiceManager()
private init() {}
func register() -> Void {
container.register(url: url) { (_, params) -> DepViewController in
let lesson = LessonViewController.create(params)
return lesson
}
}
}
extension RouteManager {
func presentController() -> Void {
let url = "dispatch://course/lesson?id=1"
self.presentURL(url, controllerType: LessonViewController.self, container: container, animated: true)
}
}
想要贡献吗?
如果您想做出贡献,请从贡献指南开始。如果您有任何问题,随时提问。
许可
DispatchCenter 在 MIT 许可下发布。详细信息请参阅 LICENSE。