Swift发布订阅事件通讯SwiftEventBus

740 阅读1分钟

允许不需要组件之间显式的知道彼此的情况下进行发布订阅样式的通信

特点

  • 简化了组件之间的通信
  • 解耦事件发送方和接收方
  • 避免复杂和容易出错的依赖关系和生命周期问题
  • 使您的代码更简单
  • 很快
  • 很小
  • 线程安全

用法

准备订阅

用户实现事件处理方法,在接收事件时会调用

SwiftEventBus.onMainThread(target, name: "someEventName") { result in
    // UI thread
    // 主线程操作UI相关
}

// or

SwiftEventBus.onBackgroundThread(target, name:"someEventName") { result in
    // API Access
    //非主线程
}

发布事件

从你的代码任意部分发布一个事件。所有匹配事件类型的订阅服务器都将接收到

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"
}

从后台线程向主线程发布事件

@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")