RxSwift Observable, который выбрасывает Error альтернативу catchErrorJustReturn - PullRequest
1 голос
/ 09 ноября 2019

Я ищу альтернативный способ обработки ошибок, возникающих в наблюдаемой последовательности.

У меня есть запрос к базе данных, который часто просто выдает DaoError.notFound (то есть данные не найдены).

Затем я выполняю запрос Remote API, который сохраняет новые данные в базу данных, и это должно заставить CoreData выдавать новые данные через первую наблюдаемую последовательность. Но это не происходит, несмотря на использование RxCoreData. И причина в том, что первый Observable завершается с ошибкой.

Я могу использовать:

catchErrorJustReturn ([]) , но он генерирует пустой массив элементов и завершает наблюдаемую последовательность, больше элементов не будет генерироваться через эту последовательность.

retry () но повторные попытки зависают, что также не является идеальным решением, так как при отсутствии элементов я просто хочу отобразить пустое табличное представление без элементов.

Идеальным решением будет просто каким-то образом отобразить или исправить ошибки на пустые массивы, но сохранить наблюдаемый поток живым. Но этого не происходит.

Самым простым решением будет замена DaoError.notFound на возвращение пустого массива, но странно, что я не могу сохранить ошибку и при некотором использовании создать бесконечный поток и игнорировать ошибки.

1 Ответ

0 голосов
/ 10 ноября 2019

Это звучит как работа для catchError(_:)

let myData = database.getData().catchError { _ in api.getData().startWith([]) }

Дополнительный код, основанный на комментарии:

Вот более сложный пример:

let myData = database.getData().catchError { _ in
    api.getData()
        .do(onNext: { database.saveData($0) })
        .startWith([])
}

Вышебудет пытаться получить данные из базы данных. Если это не удастся, он создаст пустой массив и попытается получить данные из API. Если он получит новые данные, он сохранит новые данные в базе данных и выдаст новые данные.

Основной ответ остается тем же, используйте catchError(_:).

...