TopicEventBus 0.0.3

TopicEventBus 0.0.3

Matan 维护。



  • YOURNAME

TopicEventBus

基于 Pub/Sub 设计模式的实现框架,具有按主题发布事件的能力。

Language

TopicEventBus Icon

关于

TopicEventBus 是一种易于使用、类型安全的实现 Pub/Sub 模式的方法。

有许多其他库旨在解决这个问题,但没有一个库在类型安全的方式下支持按主题发布事件,而且没有使用魔法字符串。

此外,TopicEventBus 对其观察者使用弱引用,所以您没有必要担心内存泄漏。

什么是主题?

例如,当你想发布 "ConversationUpdateEvent",但又想只对具有会话 id "1234" 或所有监听器发布该事件时。

指定会话 ID 就是为该事件指定了一个主题。

展示代码和它能为我带来什么。

让我们构建一个聊天应用吧!

在这个应用中,我们将拥有多个会话屏幕,每个屏幕都只想知道其自己会话的更改。

第一步,创建一个会话更新的事件

class ConversationChangedEvent: TopicEvnet {
    let newTitle: String
    init(conversationId: String, newTitle: String) {
        self.newTitle = newTitle
        super.init()
        self.key = conversationId
    }
}

每个事件都必须继承自“TopicEvent”类,如果事件包含主题(在我们的例子中将是会话ID),则将“key”属性设置为正确值。

现在在ConversationVC中订阅此事件

请注意,您只需要指定期望返回的值,以便TopicEventBus可以找到您订阅的事件

class ConversationVC: UIViewController {
    let topicEventBus: TopicEventBus
    let conversationId = "1234"
    
    init(topicEventBus: TopicEventBus) {
        self.topicEventBus = topicEventBus
    }
   
    override func viewDidLoad() {
        super.viewDidLoad()
        _ = self.topicEventBus.subscribe(topic: conversationId, callback: { (conversationChangedEvent: ConversationChangedEvent) in
            // This will run every time "ConversationChangedEvent" with id 1234 will be fired.
        })
    }
}

这就是触发事件的办法。

class FiringService {
    let topicEventBus: TopicEventBus
    init(topicEventBus: TopicEventBus) {
        self.topicEventBus = topicEventBus
    }
    
    func conversationTitleChanged() {
        self.topicEventBus.fire(event: ConversationChangedEvent.init(conversationId: "1234",
                                                                                            newTitle: "First update"))
    }
}

成功了!您已使用主题触发了第一个事件。🤗 🎉

API

如果您订阅事件时未指定主题,则无论它们的key值如何,您都会接收该类型的所有事件。

_ = self.topicEventBus.subscribe { (conversationChangedEvent: ConversationChangedEvent) in
  // All events from this type: ConversationChangedEvent will trigger this block
}

在订阅后通过调用返回的对象上的“stop”来取消订阅。

let listener = self.topicEventBus.subscribe(topic: conversationId, callback: { (conversationChangedEvent: ConversationChangedEvent) in
            //
})
listener.stop()        

在应用程序注销时,只需调用

self.topicEventBus.terminate()

示例项目

请注意,示例项目中包含测试,以支持所有边缘情况,以及上述代码片段中的示例代码。

安装

CocoaPods

TopicEventBus通过CocoaPods提供。要安装它,只需将以下行添加到Podfile中

pod 'TopicEventBus'

手动安装

  1. 下载并将/TopicEventBus文件夹拖放到您的项目中。
  2. 恭喜!

作者

Matan用GitHub创建了此项目。❤️.