КОНТЕКСТ
Я хотел бы выполнить 3 различных операции последовательно, используя RxSwift:
- Выбор продуктов
- Когда выбор продуктов завершен, удалить кеш
- Когда удаление кеша выполнено, сохраните новый кеш с продуктами из шаг 1
Это определения функций в моих сервисах:
struct MyService {
static func fetchProducts() -> Observable<[Product]> {...}
static func deleteCache() -> Observable<Void> {...}
static func saveCache(_ products: [Product]) -> Observable<Void> {...}
}
Я реализую это поведение обычно с flatMapLatest
.
Однако при таком подходе я потеряю результат 1-й наблюдаемой ([Product]
), потому что операция в середине (deleteCache
) не получает аргументов и возвращает Void после завершения.
struct CacheViewModel {
static func refreshCache() -> Observable<Void> {
return MyService.fetchProducts()
.flatMapLatest { lostProducts in MyService.deleteCache() }
.flatMapLatest { MyService.saveCache($0) } // Compile error*
}
// * Cannot convert value of type 'Void' to expected argument type '[Product]'
}
Ошибка компиляции абсолютно справедлива, так как операция в середине "разрывает" проходящую цепочку для первого результата.
ВОПРОС
Какой механизм используется для выполнения этого последовательного выполнения с RxSwift, накапливая результаты предыдущих операций?