SwiftEventBus
允许组件之间的发布/订阅式通信,而无需组件明确意识到彼此
特性
- 简化组件间的通信
- 解耦事件发送者和接收者
- 避免了复杂且容易出现错误依赖和生命周期问题
- 使您的代码更简单
- 速度快
- 体积小
- 线程安全
安装
CocoaPods
pod 'SwiftEventBus', :tag => '5.0.0', :git => 'https://github.com/cesarferreira/SwiftEventBus.git'
Carthage
github "cesarferreira/SwiftEventBus" == 5.0.0
版本
5.+
对swift 5
版本3.+
对swift 4.2
版本2.+
对swift 3
版本1.1.0
对swift 2.2
版本
用法
1 - 准备订阅者
订阅者实现事件处理方法,当接收到事件时会调用这些方法。
SwiftEventBus.onMainThread(target, name: "someEventName") { result in
// UI thread
}
// or
SwiftEventBus.onBackgroundThread(target, name:"someEventName") { result in
// API Access
}
2 - 发送事件
从代码的任何部分发送事件。所有匹配事件类型的订阅者都将接收到它。
SwiftEventBus.post("someEventName")
--
带有参数的事件总线
发送事件
SwiftEventBus.post("personFetchEvent", sender: Person(name:"john doe"))
期望参数
SwiftEventBus.onMainThread(target, name:"personFetchEvent") { result in
let person : Person = result.object as Person
println(person.name) // will output "john doe"
}
从后台线程到主线程发送事件
引用官方 Apple 的文档
常规的通知中心在通知发布时在其线程上传递通知
关于这个限制,@nunogoncalves 实现了这个特性并提供了一个工作示例
@IBAction func clicked(sender: AnyObject) {
count++
SwiftEventBus.post("doStuffOnBackground")
}
@IBOutlet weak var textField: UITextField!
var count = 0
override func viewDidLoad() {
super.viewDidLoad()
SwiftEventBus.onBackgroundThread(self, name: "doStuffOnBackground") { notification in
println("doing stuff in background thread")
SwiftEventBus.postToMainThread("updateText")
}
SwiftEventBus.onMainThread(self, name: "updateText") { notification in
self.textField.text = "\(self.count)"
}
}
//Perhaps on viewDidDisappear depending on your needs
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
SwiftEventBus.unregister(self)
}
--
注销
从目标对象移除所有观察者
SwiftEventBus.unregister(target)
从目标对象移除同名的观察者
SwiftEventBus.unregister(target, "someEventName")