NetworkBoundResource в RxSwift - PullRequest
       5

NetworkBoundResource в RxSwift

0 голосов
/ 06 февраля 2019

Я разработчик для Android, но я новичок в Swift/Rxswift, я пытался закодировать эквивалент для NetworkBoundResource , но я не уверен, что это возможно сделать, используя Rxswift, так как ему не хватаетэквивалент MediatorLiveData и оператора слияния не позволят вам назначить замыкание для каждой наблюдаемой.

Любая подсказка?

1 Ответ

0 голосов
/ 07 февраля 2019

Вот полезная функция фабрики.Вы вызываете это, передавая инструкции о том, как извлечь данные из БД и сети и как сохранить данные в БД.Он генерирует оператор, который можно использовать в 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])
        }
    }
}

Просто мысль.

...