Как создать ViewModel, который форматирует данные модели, полученные из API, в Swift UI? - PullRequest
0 голосов
/ 14 июля 2020

Ответ API от Disease. sh. Он просто возвращает один объект, а не массив объектов.

{
  "updated": 1594733467666,
  "cases": 13272547,
  "todayCases": 42947,
  "deaths": 576485,
  "todayDeaths": 1508,
  "recovered": 7745927,
  "todayRecovered": 54476,
  "active": 4950135,
  "critical": 59278,
  "casesPerOneMillion": 1703,
  "deathsPerOneMillion": 74,
  "tests": 277118391,
  "testsPerOneMillion": 35707.02,
  "population": 7760893407,
  "oneCasePerPeople": 0,
  "oneDeathPerPeople": 0,
  "oneTestPerPeople": 0,
  "activePerOneMillion": 637.83,
  "recoveredPerOneMillion": 998.07,
  "criticalPerOneMillion": 7.64,
  "affectedCountries": 215
}

Мой файл модели

//  Model
//  GlobalCases.swift

import Foundation

struct GlobalCases: Codable {
    
    var updated: Int?
    var cases: Int?
    var active: Int?
    var recovered: Int?
    var deaths: Int?
    var todayCases: Int?
    var todayDeaths: Int?
    var todayRecovered: Int?
}

Это файл для веб-сервисов.

//  Web Services
//  GlobalCasesAPI.swift


import Foundation

class GlobalCasesAPI {
    
    let globalURL: String = "https://disease.sh/v3/covid-19/all"
    
    func getGlobalCases(completion: @escaping (GlobalCases?) ->()) {
        
        guard let url = URL(string: globalURL) else {
            
            completion(nil)
            return
        }
        
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) { data, response, error in
            
            guard let data = data, error == nil else {
                
                print("No data in response: \(error?.localizedDescription ?? "Unknown error").")
                
                DispatchQueue.main.async {
                    completion(nil)
                }
                return
            }
            
            do{
                let globalcases = try JSONDecoder().decode(GlobalCases.self, from: data)
                DispatchQueue.main.async {
                    completion(globalcases)
                }
            }
            catch {
                print(error)
                completion(nil)
            }
            
        }.resume()
        
    }
}

Теперь мне нужна ViewModel, которая извлекает данные и форматирует их (даты и прочее). Например:

//  ViewModel
//  GlobalCasesViewModel.swift


import Foundation
import Combine


class GlobalCasesViewModel: ObservableObject, Identifiable {
    
    var globalCases = GlobalCases()
    
    let id = UUID()
    
    var updated: NSDate {
        return NSDate(timeIntervalSince1970: TimeInterval(self.globalCases.updated ?? 1594716069959))
    }
    
    var cases: Int {
        return self.globalCases.cases ?? 0
    }
    
    var active: Int {
        return self.globalCases.active ?? 0
    }
    
    var recovered: Int {
        return self.globalCases.recovered ?? 0
        
    }

    var deaths: Int {
        return self.globalCases.deaths ?? 0
    }
    
    var todayCases: Int {
        return self.globalCases.todayCases ?? 0
    }
    
    var todayDeaths: Int {
        return self.globalCases.todayDeaths ?? 0
    }
    
    var todayRecovered: Int {
        return self.globalCases.todayRecovered ?? 0
    }
}

Как мне вызвать getGlobalCases() в ViewModel, чтобы данные загружались в модель, которая затем могла быть отформатирована, как мне нравится?

...