EmitterKit 5.2.2

EmitterKit 5.2.2

测试已测试
Lang语言 SwiftSwift
许可协议 MIT
Released最后发布2019年5月
SPM支持 SPM

Alec Larson 维护。



  • 作者:
  • Alec Larson

emitter-kit v5.2.2

stable CocoaPods Compatible Carthage Compatible Platform

用于替换 NSNotificationCenter#addObserverNSObject#addObserver 的类型安全且简洁的程序。

import EmitterKit

// A generic event emitter (but type-safe)!
var event = Event<T>()

// Any emitted data must be the correct type.
event.emit(data)

// This listener will only be called once.
// You are *not* required to retain it.
event.once { data: T in
  print(data)
}

// This listener won't stop listening;
// unless you stop it manually,
// or its Event<T> is deallocated.
// You *are* required to retain it.
var listener = event.on { data: T in
  print(data)
}

// Stop the listener manually.
listener.isListening = false

// Restart the listener (if it was stopped).
listener.isListening = true

 

目标定位

目标允许您将特定的 AnyObject 与一个 emit 调用关联起来。当您需要发射与您不能添加属性类的类相关的事件(如 UIView)时,这很有用。

调用 emit 时,您还必须使用相同的目标调用 ononce,以便接收已发射的事件。

let myView = UIView()
let didTouch = Event<UITouch>()

didTouch.once(myView) { touch in
  print(touch)
}

didTouch.emit(myView, touch)

 

NSNotification

当您被迫使用 NSNotificationCenter(例如,如果您想知道键盘何时出现)时,Notifier 类有帮助。

// You are **not** required to retain this after creating your listener.
var event = Notifier(UIKeyboardWillShowNotification)

// Handle NSNotifications with style!
listener = event.on { (notif: Notification) in
  print(notif.userInfo)
}

 

键值观察(KVO)

// Any NSObject descendant will work.
var view = UIView()

// "Make KVO great again!" - Donald Trump
listener = view.on("bounds") { (change: Change<CGRect>) in
  print(change)
}

 

线程安全

⚠️EmitterKit中的所有类都不是线程安全的!

以下操作必须在同一线程上进行,或者您需要进行手动锁定:

  • 触发事件
  • 添加/删除监听器
  • 设置监听器的isListening属性

 

v5.2.2 变更记录

  • 修复协议转换错误(#60)

v5.2.1 变更记录

  • 修复Carthage兼容性(非iOS平台)

v5.2.0 变更记录

  • 添加了Event.getListeners方法
  • 监听器现在总是按照它们被添加的顺序被调用
  • 可以调用不带参数的Event.emit()
  • 改善了Carthage的兼容性

v5.1.0 变更记录

  • NotificationListener类现在接收一个Notification而不是一个NSDictionary

  • 没有目标的NotificationListener现在将接收名称为Notification的每一个Notification,不管notif.object的值如何。

版本5.0.0 更新日志

  • 支持 Swift 3.0 + Xcode 8.0 beta 6

  • 已移除了 Signal 类。(请使用 Event<Void> 代替)

  • 已移除了 Emitter 抽象类。

  • 已将 EmitterListener 类重命名为 EventListener<T>

  • Event<T> 类不再有父类。

  • 已将 Notification 类重命名为 Notifier(以避免与 Foundation.Notification 冲突)。

  • Event<T>ononce 方法现在返回一个 EventListener<T>(而不是仅为 Listener

  • Notifierononce 方法现在返回一个 NotificationListener(而不是仅为 Listener

  • NSObjectononce 方法现在返回一个 ChangeListener<T>(而不是仅为 Listener

  • 现在 ChangeListener<T>keyPathoptionsobject 属性为公共。

  • Event<T> 类中添加了一个计算属性 listenerCount: Int

  • EventListener<T> 类添加了一个属性 event: Event<T>

旧版本的更新日志可以在此处找到