RxSwit — драйвер от наблюдаемых игнорирующих ошибок

Допустим, у меня есть некоторое представление, изначально заполненное некоторыми данными. Затем я получаю данные по сети и хочу обновить представление с помощью этих обновленных данных.

На данный момент я хочу создать драйвер из этого наблюдаемого для управления элементами пользовательского интерфейса. Однако в случае ошибки в наблюдаемом я ничего не хочу делать, так как в представлении уже есть некоторые данные, поэтому я просто хочу игнорировать такую ​​​​ошибку. Функция asDriver() хочет определить, что следует делать в случае ошибки. Можно ли сделать это так:

let dataUpdated: Observable<DataItem> = ...

let driver = dataUpdated.asDriver(onErrorDriveWith: Driver<DataItem>.empty())

?


person Wujo    schedule 15.09.2017    source источник


Ответы (3)


Как было предложено, решением может быть использование .filter(). Я предполагаю, что что-то вроде этого решит вашу проблему:

extension Observable {
    func asDriverIgnoringErrors() -> Driver<E> {
        return self.map { $0 as E? }
            .asDriver(onErrorJustReturn: nil)
            .filterNil()
    }
}
person André Schmidt    schedule 01.11.2018

Почему вы не используете catchErrorJustReturn(DataItem()) ?

person CZ54    schedule 15.09.2017
comment
Потому что я не хочу заполнять представление пустыми данными при возникновении ошибки. - person Wujo; 15.09.2017
comment
Вы можете использовать фильтр или оператор сканирования, чтобы предотвратить это. - person CZ54; 15.09.2017
comment
Поскольку Driver заставляет вас также наблюдать за побочными эффектами основного потока и общих ресурсов (share (replay: 1, scope: .whileConnected)) в дополнение к тому, чтобы никогда не выдавать ошибку. github.com/ReactiveX/RxSwift/blob/master/ Документация/ - person evya; 04.12.2018

Попробуй это:

extension ObservableType {
    public var asDriverSkippingErrors: Driver<Element> {
        return map { Optional($0) }
            .asDriver(onErrorJustReturn: nil)
            .unwrap()
    }
}
person dollar2048    schedule 01.07.2021