У меня есть некоторый код, созданный с использованием RxSwift, и я пытаюсь преобразовать его для использования инфраструктуры Apple Combine.
Одним из распространенных шаблонов является использование Observable.create
дляснимать наблюдаемые (обычно сетевые запросы). Примерно так:
func loadWidgets() -> Observable<[Widget]> {
return Observable.create { observer in
// start the request when someone subscribes
let loadTask = WidgetLoader.request("allWidgets", completion: { widgets in
// publish result on success
observer.onNext(widgets)
observer.onComplete()
}, error: { error in
// publish error on failure
observer.onError()
})
// allow cancellation
return Disposable {
loadTask.cancel()
}
}
}
Я пытаюсь сопоставить это с Combine, и я не смог до конца понять это. Самое близкое, что я смог получить, - это использовать Future для чего-то вроде этого:
func loadWidgets() -> AnyPublisher<[Widget], Error> {
return Future<[Widget], Error> { resolve in
// start the request when someone subscribes
let loadTask = WidgetLoader.request("allWidgets", completion: { widgets in
// publish result on success
resolve(.success(widgets))
}, error: { error in
// publish error on failure
resolve(.failure(error))
})
// allow cancellation ???
}
}
Как вы можете видеть, он делает большую часть этого, но нет возможности отменить. Во-вторых, будущее не допускает многократных результатов.
Есть ли способ сделать что-то вроде шаблона Rx Observable.create
, который позволяет отменять и, необязательно, многократные результаты?