Как правильно использовать MVVM при сохранении ответа API в CoreData?IOS

Программируем под IOS
Ответить
Anonymous
 Как правильно использовать MVVM при сохранении ответа API в CoreData?

Сообщение Anonymous »


Предположим, у меня есть API для получения данных и их последующего отображения в UITableView. Но это должно работать и в автономном режиме (чтобы показывать последние полученные данные). Поэтому при применении MVVM у меня есть метод получения данных. В настоящее время я сначала проверяю, активна ли сеть, и если да, то получаю данные из API и сохраняю их в CoreData, а затем использую этот экземпляр модели CoreData для отображения моих данных в UITaleView.

Например: viewModel.newsData // из CoreData [News] ()

Но из-за этого проводить модульное тестирование очень сложно. Итак, я сохранил свойство метода, называемое save (логическое значение). И только при выполнении модульного тестирования я делаю его ложным. Чтобы он возвращал экземпляр моего класса модели. Мне такой подход совершенно не нравится.

Более того, этот API также предоставляет мне URL-адрес изображения. В настоящее время я извлекаю это изображение и сохраняю его непосредственно как «Данные» в моей модели CoreData, чтобы можно было легко отображать его в пользовательском интерфейсе, а не выполнять выборку снова и снова. Текущий код приведен ниже.
класс NewsViewModel { Private (set) var apiData = [NewsModel]()//Цель тестирования Uinit частный (установить) var newsData = [Новости]() частный (установить) var filteredNewsData = [News]() частный (set) var uniqueNewsTypes = Set () частный (установленный) статический var nextPage = 1 частный статический var pageSize = 10 частное статическое смещение var = 0 частный выпуск newsDataService:NewsServiceProtocol //Внедрение зависимости init(newsService:NewsServiceProtocol = NewsDataService()) { новостиДанныеСервис = НовостиСервис } public func fetchNews(_ save: Bool? = true,completion:@escaping (Result)-> Void,_ isReload:Bool = false) { если !isReload { делать{ попробуйте CoreDataManager.shared.fetchData(entity: Entity.NEWS, модель: News.self, завершение: {[weak self] (результат) в если result.count > 0 { self?.newsData = результат self?.filteredNewsData = self?.newsData ?? [] self?.uniqueNewsTypes = Set(self?.newsData.map { $0.news_type ?? ""} ?? []) self?.uniqueNewsTypes.insert(Constants.ALL) завершение(.успех(())) }еще{ self?.getDataFromAPI( следующая страница: NewsViewModel.nextPage, pageSize: NewsViewModel.pageSize, смещение: NewsViewModel.offset, saveData: сохранить!, завершение: завершение) } }) }ловить{ печать (AlertMerssage.CORE_DATA_ERROR) } }еще { self.getDataFromAPI(nextPage: NewsViewModel.nextPage, pageSize: NewsViewModel.pageSize, смещение: NewsViewModel.offset, saveData: сохранить!, завершение: завершение) } } //Параметр SaveData предназначен для проведения границы между модульным тестом и фактическими данными. Bcz в модульном тесте не нужно сохранять фиктивные данные в БД fileprivate func getDataFromAPI (nextPage: Int, pageSize: Int, смещение: Int, saveData: Bool, завершение: @escaping (Result) -> Void) { newsDataService.fetchNewsData(nextPage: nextPage, pageSize: pageSize, offset: offset, успех: {[weak self] (новости) в если пусть новости = новости { self?.apiData = новости // Сохранить в CoreData если сохранитьДанные { CoreDataManager.shared.saveAndUpdateNews(данные: новости) себя?.fetchNewsFromCoreData() } завершение(.успех(())) } еще { // Обрабатываем случай, когда новостей нет. let error = NSError (домен: Constants.API, код: -1, userInfo: [NSLocalizedDescriptionKey: AlertMerssage.SERVER_ERROR_MESSAGE]) завершение(.неудача(ошибка)) } }) { (код_ошибки, сообщение) в let error = NSError(домен: Constants.API, код: error_code, userInfo: [NSLocalizedDescriptionKey: "\(message)"]) завершение(.неудача(ошибка)) } } fileprivate func fetchNewsFromCoreData () { делать{ попробуйте CoreDataManager.shared.fetchData(entity: Entity.NEWS, модель: News.self, завершение: {[weak self] (результат) в self?.newsData = результат self?.filteredNewsData = self?.newsData ?? [] self?.uniqueNewsTypes = Set(self?.newsData.map { $0.news_type ?? ""} ?? []) self?.uniqueNewsTypes.insert(Constants.ALL) }) }ловить{ печать (AlertMerssage.CORE_DATA_ERROR) } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»