如何在 combine 框架中实现 rxswift 的 methodInvoked 函数

How to implement rxswift's methodInvoked function in the combine framework

提问人:Jiss 提问时间:9/1/2023 最后编辑:HangarRashJiss 更新时间:10/4/2023 访问量:162

问:

我目前正在使用 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 函数,如上面的代码。

RX-SWIFT 组合

评论

1赞 Daniel T. 9/1/2023
Combine 与 UIKit 的集成非常缺乏。你得到的最好的是 CombineCocoa,它非常轻巧,据我所知只涵盖了几个 UIControls。
0赞 Daniel T. 9/1/2023
所以回答你的问题。它是可以实现的,但它需要相当多的设置代码,包括一些 Objective-C 代码。这不是可以在这里回答的问题,但如果你浏览 RxSwift GitHub,你可能会梳理出来。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 方法作为主题的值。PassthroughSubjectAnyPublishersend

-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 的正式认可。