Это было забавное исследование.Ниже показано, как UIControl настроен в RxCocoa.
В ответ на ваши вопросы:
Какой объект будет добавлен в качестве цели (метод addTarget) к базе?
Вы должны создать класс, предназначенный для этого.Я назвал его ATarget
.
Кто удерживает этот объект?
Вы заставляете объект соответствовать Disposable
и затем он будет сохраняться до уничтожения.
extension Reactive where Base: A {
var event: Observable<A> {
return Observable.create { [weak a = self.base] observer in
guard let a = a else {
observer.on(.completed)
return Disposables.create()
}
let aTarget = ATarget(a: a, callback: { a in
observer.on(.next(a))
})
return Disposables.create(with: aTarget.dispose)
}
.takeUntil(deallocated)
}
}
class ATarget: NSObject, Disposable {
typealias Callback = (A) -> Void
let selector: Selector = #selector(ATarget.eventHandler)
weak var a: A?
var callback: Callback?
init(a: A, callback: @escaping Callback) {
self.a = a
self.callback = callback
super.init()
a.addTarget(target: self, action: selector)
}
@objc func eventHandler() {
if let callback = self.callback, let a = self.a {
callback(a)
}
}
func dispose() {
self.a?.removeTarget(target: self)
self.callback = nil
}
}