我目前正在使用 rxswift,但正在研究组合框架。
我在 rxswift 中经常使用 methodInvoked 函数。
是否可以在combine框架中创建类似methodInvoked方法的功能?
public extension Reactive where Base: UIViewController {
var viewWillAppear: Observable<[Any]> {
return methodInvoked(#selector(UIViewController.viewWillAppear(_:)))
}
var viewDidAppear: Observable<[Any]> {
return methodInvoked(#selector(UIViewController.viewDidAppear(_:)))
}
var viewDidDisappear: Observable<[Any]> {
return methodInvoked(#selector(UIViewController.viewDidDisappear(_:)))
}
var viewWillDisappear: Observable<[Any]> {
return methodInvoked(#selector(UIViewController.viewWillDisappear(_:)))
}
}
我想使用combine框架实现像上面代码一样的methodInvoked函数。
是的,可以为用 Objective-C 编写的方法重现该功能。用自定义实现(可能会或可能不会调用原始方法定义)替换 Objective-C 方法的技术通常称为“Monkey Patching”或“Method Swizzling”,您可以通过 Google 找到这样做的技术。这是一个例子:
https://nshipster.com/method-swizzling/
要使用组合实现相同的功能,您可能会使用将类型擦除为
PassthroughSubject
的 AnyPublisher
,并在每次调用该方法时让您的替代 Objective-C 方法 send
为主题提供一个值。