未生成RxSwift委托绑定吗?

问题描述 投票:0回答:1

我正在尝试绑定一个委托,这已经完成了

/** 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()开始的委托?

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

谢谢,让我知道!

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

rx-swift rx-cocoa
1个回答
0
投票

已符合TestEventGenerator:ReactiveCompatible,并将对其进行修复。

© www.soinside.com 2019 - 2024. All rights reserved.