切换Observable map Rxswift中的案例



我在视图模型中有一个反应式闭包,用于根据类型(发货或计费(返回和排序网络呼叫中的数据。

Observable.combineLatest(input.headerRefresh, type).flatMapLatest({ (header, type) -> Observable<[AddressItemViewModel]> in
var els : Observable<[AddressItemViewModel]>
els = self.request()
.trackActivity(self.loading)
.trackActivity(self.headerLoading)
.trackError(self.error)
return els.map{
$0.map {
print(type)
var item  : AddressItemViewModel!
switch(type){
case .shipping:
if($0.address.isShipping){
item = AddressItemViewModel(with: $0.address)
}
case .billing:
if($0.address.isBilling){
item = AddressItemViewModel(with: $0.address)
}
}
return item // error
}
}
}).subscribe(onNext: { (items) in
elements.accept(items)
}).disposed(by: rx.disposeBag)

在视图控制器中订阅elements时,应用程序在return item处崩溃。

所以我的问题是如何在不使用可为null的对象的情况下对项进行排序?谢谢

错误:

线程1:致命错误:在展开可选值

问题可能是这一行:

var item  : AddressItemViewModel!

使用隐式展开变量可能会导致致命错误。想想当您的type设置为.shipping$0.address.isShipping设置为false(或者typebilling$0.address.isBillingfalse(时会发生什么?item变量将设置为nil,但item的类型需要为非零。我认为最好的选择是使用compactMap而不是map来只传递非零值:

$0.compactMap {
switch(type){
case .shipping where $0.address.isShipping:
fallthrough
case .billing where $0.address.isBilling:
return AddressItemViewModel(with: $0.address)
default:
return nil
}
}

最新更新