Вот полезная функция фабрики.Вы вызываете это, передавая инструкции о том, как извлечь данные из БД и сети и как сохранить данные в БД.Он генерирует оператор, который можно использовать в flatMap для получения результата из запроса.
Сначала он выдаст значение из БД, а затем сделает сетевой запрос.Если сетевой запрос выполнен успешно, оператор выдаст результат и также отправит его в БД для хранения.
Меня бы назвали так: let getResource = resource(loadFromDb: /* loader */, network: /* requester */, save: /* saver */)
Тогда вы могли бы использовать getRequest
в flatMap поверхНаблюдаемый за RequestType.
func resource<RequestType, ResultType>(loadFromDb: @escaping (RequestType) -> Observable<ResultType>,
network: @escaping (RequestType) -> Observable<ResultType>,
save: AnyObserver<(RequestType, ResultType)>
) -> (RequestType) -> Observable<ResultType> {
return { request in
return Observable.create { observer in
let netResult = network(request)
.share(replay: 1)
let dispose1 = Observable.concat(loadFromDb(request), netResult)
.bind(to: observer)
let dispose2 = netResult
.map { (request, $0) }
.bind(to: save)
return Disposables.create([dispose1, dispose2])
}
}
}
Просто мысль.