尝试找出如何使用RxSwift制作应用程序并探索多个开源项目(即CleanArchitectureRxSwift和SwiftHub)时,我经常发现
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)") })
}
通过使用这种方法,您可以使读者清楚地知道,您绝对确定链不会产生错误。