未生成 RxSwift 委托绑定?

Posted

技术标签:

【中文标题】未生成 RxSwift 委托绑定?【英文标题】:RxSwift Delegate Binding isn't Generated? 【发布时间】:2020-02-03 07:19:28 【问题描述】:

我正在尝试绑定一个委托,这就是我们所做的

/** Delegate Proxy **/
func castOrThrow<T>(_ resultType: T.Type, _ object:Any) throws -> T 
    guard let returnValue = object as? T else 
        throw RxCocoaError.castingError(object: object, targetType: resultType)
    
    return returnValue

@objc
public protocol TestEventGeneratorDelegate:class 
    @objc optional func asyncEventResult(int:Int)

open class TestEventGenerator 
    public var delegate: TestEventGeneratorDelegate?
    func asyncCall() 
        DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(1))  [weak self] in
            guard let self = self else   return 
            self.delegate?.asyncEventResult!(int: 0)
        
    

extension TestEventGenerator: HasDelegate 
    public typealias Delegate = TestEventGeneratorDelegate

open class RxTestDelegateProxy : DelegateProxy<TestEventGenerator,TestEventGeneratorDelegate>,
                                DelegateProxyType,
                                TestEventGeneratorDelegate 
    public weak private(set) var testGenerator: TestEventGenerator?
    public init(testEventGenerator: ParentObject) 
        self.testGenerator = testEventGenerator
        super.init(parentObject: testEventGenerator, delegateProxy: RxTestDelegateProxy.self)
    
    public static func registerKnownImplementations() 
        self.register  RxTestDelegateProxy(testEventGenerator: $0) 
    

extension Reactive where Base: TestEventGenerator 
    public var delegate: DelegateProxy<TestEventGenerator, TestEventGeneratorDelegate> 
        return RxTestDelegateProxy.proxy(for: base)
    
    public var asyncEventResult: Observable<Int> 
        let source =  delegate.methodInvoked(#selector(TestEventGeneratorDelegate.asyncEventResult(int:)))
        .map  (a) in
            return try castOrThrow(Int.self,a[0])
        
        return source
    

/**  Delegate Proxy **/

然后当我使用它时

let testEventGenerator = TestEventGenerator()
textEventGenerator.rx.asyncEventResult.subscribe.... // subscribe here no rx found? 
testEventGenerator.asyncCall() // call and wait for the observable to return to the delegate 

它没有编译并说没有这样的rx

我必须绑定它,因为编写 API 的人没有使用回调来返回值,而是使用委托。

这是他如何编写代码以及我想如何包装它的示例。

有没有办法绑定需要从 asyncCall() 启动的委托?

所以我可以使用 flatmapLatest 以 promiseLike 的方式链接它?

谢谢告知!

我遵循了这些教程: How to convert Delegate to Observable RxSwift? 和 https://blog.ippon.fr/2018/11/13/rxswift-how-to-make-your-favorite-delegate-based-apis-reactive/

【问题讨论】:

【参考方案1】:

符合 TestEventGenerator:ReactiveCompatible 并且会修复它。

【讨论】:

以上是关于未生成 RxSwift 委托绑定?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxSwift 将 UITableViewCell 中的控件绑定到 ViewModel 的最佳实践

如何在 RxSwift 中将 UISwitch 绑定到 UIButton 启用?

当委托字段不被称为 `delegate` 时实现 `DelegateProxy` (RxSwift/RxCocoa)

RxSwift:在使用 flatMap 和 reduce 时需要帮助

未调用 Rxswift Map 和 Zip

UITextField 使用 RxSwift 绑定到 ViewModel