【发布时间】:2017-03-23 13:38:45
【问题描述】:
我有一个案例,我正在使用 3rd 方库,我想把它变成一个 Observable。适当地,该库是围绕代表设计的,正如人们所期望的那样,所以我将它包装起来。库执行异步操作并在完成时调用它的委托并使用结果。
我绝对想利用 observable 的 cold 特性,并且仅在有人订阅时才开始操作。我有一个可行的解决方案,我只是不知道它是否存在严重缺陷,并且我缺少对RxSwift 的一些重要理解,或者也许有更简单的方法可以实现相同的目标。
public final class RxLibBridge: LibDelegate{
let lib = Lib()
let _source = PublishSubject<[LibResult]>()
public init(){
lib.delegate = self
}
public func asObservable() -> Observable<[LibResult]>{
// create a cold observable to start
// the Lib's async operation on subscribe.
return Observable<Void>.create{
observer in
self.lib.startOperation()
// emit and complete
observer.onNext(())
observer.onCompleted()
return Disposables.create()
}
// convert the `Void` observable into an observable from the
// PublishSubject
.flatMapLatest{self._source}
}
// the lib's completion delegate method
public func lib(_ lib: Lib, didFinishWithResult results: [LibResult]) {
// grab the PublishSubject, emit the result and complete
let observer = _source.asObserver()
observer.onNext(results)
observer.onCompleted()
}
}
所以我的问题是:这在 Rx 中是否合适?再次,它有效:
RxLibBridge()
.asObservable()
.subscribe(...)
仅仅因为它有效并不意味着我没有从根本上误解处理这种情况的正确方法。
我知道在 RxSwift 中有一种方法可以处理这样的事情:
https://samritchie.net/2016/05/12/rxswift-delegateproxy-with-required-methods/
我尝试了这种方法,但似乎 API 自 2015 年以来发生了变化。也就是说,在上面的示例链接中,在扩展中添加 rx_delegate 方法时找不到 proxyForObject。
此外,这种方法似乎更倾向于纯 Objective-C [UIKit/AppKit] API。在我尝试遵循链接示例时,我正在编辑 3rd 方库的源代码以制作委托方法 optional 并将其公开给 @objc。该库的代表是required,我宁愿不必分叉该库来进行修改。
这个 SO 答案为上面的 2 个链接提供了更新的 API:
Can not use proxyForObject function in DelegateProxyType (rxSwift)
【问题讨论】: