iOS 中的事件总线等效功能

11

听说过不需要组件明确知道彼此即可进行“发布-订阅”样式通信的Java事件总线(Event bus)。使用事件总线似乎可以更轻松地在不同类之间进行通信,且需要较少的编码量。我知道在iOS中,NSNotification也能够实现这种功能。但NSNotification在这里并不是一种替代方案。除了委托模式外,请告诉我在iOS中还有哪些好的解决方案可以作为EventBus在类之间通信的良好替代方案。


你确定NSNotificationCentre不是你要找的吗?https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/index.html - Toby
NSNotificationCentre使用一对多的通信方式。我需要一次一对一的通信。 - jishnu bala
3个回答

15

使用 Swift,您可以使用 SwiftEventBus。它只是一个 NSNotificationCenter的包装器 DispatchQueue

注册事件:

SwiftEventBus.onMainThread(target, name: "someEventName") { result in
    // UI thread
    // Do something when the event occurr
}

触发事件:

SwiftEventBus.post("someEventName")

如果您需要自定义它,源代码简短清晰易懂的。

14
嗨,我是这个库的创建者,很高兴你们觉得它有用 :) 干杯! - cesarferreira

6

我认为你可以使用NSNotificationCenter来实现这个功能。我看到了你的评论,关于它是一对多的,这是默认的情况,但是你也可以指定从哪个对象接收消息,像这样:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(someSelector:)
                                             name:@"MyPersonalNotification"
                                           object:someOtherObject];

在这里,只有在someOtherObject发出通知时,您才会在someSelector:中收到MyPersonalNotification。这使得通信变成了一对一。
此外,您也可以使用Key-Value Observing API,但我个人觉得它有些不方便。

0

看一下tolo
这个功能有点类似于事件总线,与NSNotification相比有一个巨大的优势,即在deallocating时不需要取消注册(就像在iOS9中一样)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接