HSObserver
概要
Swift 更好的事件观察器。
- 更简单的 API 和合理的默认值
- 更易于避免悬空观察者
- 简单激活/禁用
- 与视图控制器生命周期简单集成
安装
HSObserver 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'HSObserver'
观察者均已发布
class Watcher {
static let wave = NSNotification.Name.init("waveNotification")
var waveObserver:HSObserver
init() {
waveObserver = HSObserver.init(forName: Watcher.wave,
activate:true,
using: { (notif) in
//Do Something
})
}
}
与标准观察器不同,waveObserver 在 Watcher 发布时完全发布。
(发布波通知不会在 Watcher 发布后调用 //Do Something
代码)
观察者可以激活和禁用
var waveObserver:HSObserver
init() {
waveObserver = HSObserver.init(forName: Watcher.wave,
using: { (notif) in
//Do Something
})
//activate
waveObserver.activate()
//deactivate
waveObserver.deactivate()
}
注意事项:请记住,您必须激活观察者才能使其工作。
- 在初始器中指定
activate:true
- 或调用 myObserver.activate()`
- 或在初始化器上的链
HSObserver.init(....).activate()
HSHasObservers 与 ViewController 生命周期良好集成
视图控制器的一个常见模式是在 viewWillAppear
中激活观察者,并在 viewDidDisappear
中取消激活它们
将 HSHasObservers
协议添加到任何类中,可以让您轻松地添加一组观察者并激活或取消激活它们
观察者可以手动添加,或者通过将 .add(to:self) 链接到 HSObserver 来添加
class ViewController: NSViewController, HSHasObservers {
override func viewDidLoad() {
super.viewDidLoad()
//Add manually
let waveObserver = HSObserver.init(forName: Watcher.wave,
using: { (notif) in
//Do Something
})
self.add(observer: waveObserver)
//Or by chaining
HSObserver.init(forName: Watcher.wave,
using: { (notif) in
//Do Something
}).add(to: self)
}
}
这很好地与视图生命周期一起工作
override func viewWillAppear() {
super.viewWillAppear()
activateObservers()
}
override func viewDidDisappear() {
super.viewDidDisappear()
deactivateObservers()
}
添加多个观察者
let manyThingsObserver = HSObserver.init(forNames: [Watcher.wave,Watcher.hello] ,
activate:true,
using: { (notif) in
//Do Something
})
指定中心、队列等
/// Create observer
///
/// - parameter name: notification name
/// - parameter obj: object to observe (default nil)
/// - parameter queue: queue to run the block on (default main)
/// - parameter center: notification center (default NotificationCenter.default)
/// - parameter block: block to run (beware of retain cycles!)
///
/// - returns: unactivated manager. Call activate() to start
convenience init(forName name: NSNotification.Name,
object obj: Any? = nil,
queue: OperationQueue? = .main,
center newCenter: NotificationCenter = NotificationCenter.default,
activate: Bool = false,
using block: @escaping (Notification) -> Swift.Void)
HSObservers 允许您跳过默认值。我们假设
- object = nil
- queue = .main
- center = NotificationCenter.default
- activate = false
您可以在初始化器中覆盖这些值
请注意,Apple 的默认做法是在与发送者相同的队列上调用您的块。如果想要这样做,则只需将 center = nil
我发现我通常想要使用通知来更新界面 - 因此我的默认设置是使用 .main
在 NSNotification.Name 上的便利函数
直接发布通知
class Watcher {
static let wave = NSNotification.Name.init("waveNotification")
func doPosting() {
Watcher.wave.post()
//or
Watcher.wave.post(object:self,userInfo:["Foo":"Bar"])
}
}
在直接从 NotificationCenter 发布时,考虑默认通知中心和默认选项
NotificationCenter.post(Watcher.wave)
//is equivalent to
NotificationCenter.default.post(Watcher.wave,object:nil)
作者
ConfusedVorlon, [email protected]
许可证
HSNotification可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。