iOS RxSwift, как правильно написать репозиторий, использующий как Dao, так и Service - PullRequest
0 голосов
/ 30 октября 2019

Я хотел бы иметь Репозиторий, который использует Сервис и Дао. Dao - это объект доступа к данным, который достигает данных области или ядра (через NSFetchedRequestController) для загрузки данных в виде наблюдаемой последовательности.

С другой стороны, у меня есть Служба, которая обращается к удаленному API, чтобы сделать один запрос на обновление данных в хранилище данных (Базовые данные / Область), из которого предыдущий Дао наблюдает за этими данными.

Я написал некоторый код, но я не уверен, является ли это наилучшим подходом и нет ли лучшего решения для объединения обоих Observables или использования лучших операторов. Является ли этот DisposeBag правильным?

final class RxMoviesRepository {

    private let moviesService: IMoviesService_Rx
    private let moviesQueryDao: IMoviesQueryDao_Rx

    init(service: IMoviesService_Rx, dao: IMoviesQueryDao_Rx) {
        self.moviesService = service
        self.moviesQueryDao = dao
    }

    let disposeBag = DisposeBag()
}

extension RxMoviesRepository : IMoviesRepository {

    func getMovies(query: String, page: Int) -> Observable<[Movie]> {

        // Cached Local Storage Sequence
        let movies = moviesQueryDao.load(query: query, page: page)
                     .map { $0.results }

        // Remote API
        _ = moviesService.getMovies(query: query, page: page)
            .flatMap { [weak self] moviesQuery -> Observable<MoviesQuery> in
                guard let self = self else { return .empty() }
                return self.moviesQueryDao.sync(moviesQuery: moviesQuery)
            }
            .subscribe({  moviesQuery in
                print("Movies query synced to local database.")
            }).disposed(by: disposeBag)

        return movies
    }
}

Цель приведенного выше кода состоит в следующем: 1) чтобы получить наблюдаемую информацию о фильмах из Dao, она должна быть в режиме реального времени, чтобы получать новые данные для наблюдателя каждый раз, когда содержимое базы данных изменяется (ниже я использую Realm или Core). Данные с NSFetchRequestController - через сущности RxCoreData (запрос))

2), затем, прежде чем вернуть это наблюдаемое из фильмов, я делаю один запрос через Сервис, чтобы получить новые фильмы и сохранить их в локальном хранилище. Здесь, когда я получаю наблюдаемый объект MoviesQuery, я синхронизирую его с хранилищем данных через flatMap. Я думаю, что мне нужно подписаться, чтобы иметь возможность выполнить этот запрос / синхронизацию.

3) наконец, я вернул Observable, который, я думаю, можно использовать для обновления табличного представления каждый раз, когда новые данные будут выдвигаться после изменения в базе данных.

...