HSObserver 1.1.0

HSObserver 1.1.0

Confused Vorlon 维护。



  • 作者:
  • ConfusedVorlon

HSObserver

Version License Platform

概要

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文件。