Я хотел бы иметь Репозиторий, который использует Сервис и Дао. 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, который, я думаю, можно использовать для обновления табличного представления каждый раз, когда новые данные будут выдвигаться после изменения в базе данных.