переключать случаи в наблюдаемой карте Rxswift - PullRequest
0 голосов
/ 11 декабря 2018

У меня в view-модели реактивное закрытие для возврата и сортировки данных из сетевого вызова по типу (доставка или выставление счетов).

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.

Итак, мой вопрос, как сортировать элементы без использования объектов, которые могут быть пустыми?Спасибо.

Ошибка:

Тема 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

1 Ответ

0 голосов
/ 11 декабря 2018

Проблема может заключаться в следующей строке:

var item  : AddressItemViewModel!

Использование неявно развернутой переменной может привести к фатальной ошибке.Подумайте, что происходит, когда ваш type установлен на .shipping, а $0.address.isShipping установлен на false (или type равен billing, а $0.address.isBilling равен false)?Переменная 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
      }
    }
...