提问人:Jiss 提问时间:9/1/2023 最后编辑:HangarRashJiss 更新时间:10/4/2023 访问量:162
如何在 combine 框架中实现 rxswift 的 methodInvoked 函数
How to implement rxswift's methodInvoked function in the combine framework
问:
我目前正在使用 rxswift,但正在研究组合框架。
我在 rxswift 中经常使用 methodInvoked 函数。
是否可以在组合框架中创建像 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(_:)))
}
}
我想使用组合框架实现 methodInvoked 函数,如上面的代码。
答:
1赞
Scott Thompson
9/6/2023
#1
是的,可以为用 Objective-C 编写的方法重现该功能。用自定义实现替换 Objective-C 方法的技术(可能会或可能不会调用原始方法定义)通常称为“Monkey Patching”或“Method Swizzling”,您可以通过 Google 找到这样做的技术。下面是一个示例:
https://nshipster.com/method-swizzling/
要使用 combine 实现相同的功能,您可能会使用 a 将类型擦除为 an,并在每次调用该方法时将替换 Objective-C 方法作为主题的值。PassthroughSubject
AnyPublisher
send
-2赞
Ting Yi Shih
10/4/2023
#2
似乎有人提出了一个解决方案:https://swiftpack.co/package/chorim/CombineInterception。
有了这个,你就可以把它添加到你的项目中:
.package(url: "https://github.com/edudo-inc/CombineCocoa.git", from: "0.2.1")
所以你可以这样称呼import CombineInterception
viewController.publisher(for: #selector(UIViewController.viewDidLoad))
然而,这只是一个分叉的回购,还没有正式合并到 CombineCocoa 中。如果你不担心真实性,你可以将包添加到你的项目中,或者只是将存储库克隆到你的项目中,直到这个实现得到 CombineCocoa 的正式认可。
评论
methodInvoked