asDriverOnErrorJustComplete

asDriverOnErrorJustComplete

尝试找出如何使用RxSwift制作应用程序并探索多个开源项目(即CleanArchitectureRxSwiftSwiftHub)时,我经常发现

extension ObservableType {

    func asDriverOnErrorJustComplete() -> Driver<E> {
        return asDriver { error in
            return Driver.empty()
        }
    }

}

鉴于此方法在许多情况下都有用,并且确实在提到的项目中被复制,我想知道为什么它不是某些实用程序库(例如RxSwiftExt)或RxSwift本身的一部分。

考虑到SwiftHub Podfile中有多少个Rx Pod,它们中实际上没有一个包含此功能,我感到非常可疑。

我的问题是,这背后有什么真正的原因吗? asDriverOnErrorJustComplete是否以某种方式违反了Rx契约(Contract)或被认为是不良做法等?

我是否从某种意义上说这两个项目很可能是彼此复制的架构,并且没有代表性?如果是这样,是否有任何优秀的开源项目演示RxSwift + MVVM并可能避免asDriverOnErrorJustComplete或以不同的方式解决asDriverOnErrorJustComplete解决的问题?

最佳答案

我不会将该方法本身称为坏作法,但是它允许出现一个错误,而该错误将被我不特别喜欢的默默忽略。使用这样的构造是很有害的,因为您的链将毫无提示地静默失败。如果您的质量检查部门(您戴着其他帽子?)没有注意到标签不再更新的事实,则可能是一个问题。

我也不喜欢您调用的特定GitHub存储库,因为它们增加了很多恕我直言,不必要的样板。我喜欢更直接的代码。

在示例应用程序RxEarthquake中,使用以下命令:

public func asDriverLogError(_ file: StaticString = #file, _ line: UInt = #line) -> SharedSequence<DriverSharingStrategy, E> {
    return asDriver(onErrorRecover: { print("Error:", $0, " in file:", file, " atLine:", line); return .empty() })
}

因此,至少在调试中记录了错误。

我还认为以下是一个很好的选择:
public func asDriverOrAbort(_ file: StaticString = #file, _ line: UInt = #line) -> SharedSequence<DriverSharingStrategy, E> {
    return asDriver(onErrorRecover: { fatalError("Error: \($0) in file: \(file) atLine: \(line)") })
}

通过使用这种方法,您可以使读者清楚地知道,您绝对确定链不会产生错误。

10-05 19:15