DispatchCenter 1.2.0

DispatchCenter 1.2.0

steven lv 维护。



  • steven lv

DispatchCenter

logo

DispatchCenter 尝试解决的问题是什么?

当应用程序变得越来越复杂时,会大量依赖业务模块,如下所示

dependencies-bs

采用 DispatchCenter 架构,我们希望实现明确的模块职责和边界,提高代码质量,减少复杂依赖,提高开发效率,并便于问题定位,如下所示:

mediator-bs

特性

  • 使用泛型或 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