SwiftEventBus 5.0.0

SwiftEventBus 5.0.0

测试测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2019年4月
SPM支持 SPM

Syed Sabir Salman-Al-MusawiCesar Ferreira 维护。



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.0swift 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")