Make rx_tap to shareable. ControlEvent initializer move to BarButtonItemTarget.

This commit is contained in:
tarunon 2016-01-18 11:33:05 +09:00
parent 4e4d9dd794
commit 360ade3f1f
1 changed files with 23 additions and 20 deletions

View File

@ -38,22 +38,11 @@ extension UIBarButtonItem {
Reactive wrapper for target action pattern on `self`.
*/
public var rx_tap: ControlEvent<Void> {
let source: Observable<Void> = Observable.create { [weak self] observer in
guard let control = self else {
observer.on(.Completed)
return NopDisposable.instance
}
let target = BarButtonItemTarget(barButtonItem: control) {
observer.on(.Next())
}
return target
}.takeUntil(rx_deallocated)
return ControlEvent(events: source)
if let target = self.target as? BarButtonItemTarget {
return target.event
}
return BarButtonItemTarget(barButtonItem: self).event
}
}
@ -64,30 +53,44 @@ class BarButtonItemTarget: RxTarget {
weak var barButtonItem: UIBarButtonItem?
var callback: Callback!
init(barButtonItem: UIBarButtonItem, callback: () -> Void) {
var event: ControlEvent<Void>!
init(barButtonItem: UIBarButtonItem) {
self.barButtonItem = barButtonItem
self.callback = callback
super.init()
barButtonItem.target = self
barButtonItem.action = Selector("action:")
self.event = ControlEvent(events:
Observable.create { [weak self] observer in
guard let target = self else {
observer.on(.Completed)
return NopDisposable.instance
}
target.callback = {
observer.on(.Next())
}
return target
}.takeUntil(barButtonItem.rx_deallocated).share()
)
}
override func dispose() {
super.dispose()
#if DEBUG
MainScheduler.ensureExecutingOnScheduler()
#endif
barButtonItem?.target = nil
barButtonItem?.action = nil
callback = nil
event = nil
}
func action(sender: AnyObject) {
callback()
}
}
#endif