Как передать Json данных из одного класса в другой? - PullRequest
0 голосов
/ 18 июня 2020

Может ли кто-нибудь сказать, что я могу сделать?

У меня есть класс с именем RequestManager, где у меня есть URLSession, а внутри него - константа, в которой я храню данные с сервера.

import Foundation

class RequestManager {

    func fetchWeather(cityName: String,completionHandler: @escaping ([String]) -> Void){

        let weatherURL = "https://api.openweathermap.org/data/2.5/weather?q=\(cityName)&appid=55dbb1b10e9f55181ad910227f1460ae&units=metric"
        let objectURL = URL(string: weatherURL)
        let task = URLSession.shared.dataTask(with: objectURL!, completionHandler: {(data,reponse,error)in
            if error != nil{
                print(error!)
            } else{
                do{
                    let json = try JSONDecoder().decode(CityWeatherInfo.self, from: data!)
                    print(json)
                    let saveData: WeatherModel = WeatherModel(name: json.name, 
                    temp: json.main.temp, feelsLike: json.main.feelsLike,
                    tempMin: json.main.tempMin, tempMax: json.main.tempMax,
                    main: json.weathers[0].main, description: json.weathers[0].main)
                    print(saveData)

                } catch{
                    print("error")
                }
            }
        })
        task.resume()
    }
}

Я запускаю приложение и получаю это в консоли, когда запрашиваю данные сервера:

CityWeatherInfo(name: "Paris", main: Evaluación_Autofin_México.Main(temp: 20.3, feelsLike: 18.41,
tempMin: 18.0, tempMax: 21.67), weathers: [Evaluación_Autofin_México.Weather(main: "Clouds",
description: "broken clouds")])

WeatherModel(name: "Paris", temp: 20.3, feelsLike: 18.41,
tempMin: 18.0, tempMax: 21.67, main: "Clouds", description: "Clouds")

Мне нужно вставить эту информацию в ярлыки «WeatherViewDetailController», но я не могу войти в "let saveData" из RequestManager.


class WeatherDetailViewController: UIViewController {

    var weatherPresenter: WeatherDetailPresenter?
    public var cityName: String?

    let request = RequestManager()

    @IBOutlet weak var closeButton: UIButton!
    @IBOutlet weak var cityImage: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var mainLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!
    @IBOutlet weak var feelsLikeLabel: UILabel!
    @IBOutlet weak var tempMinLabel: UILabel!
    @IBOutlet weak var tempMaxLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        weatherPresenter = WeatherDetailPresenter(view: self)
        weatherPresenter?.retriveWeatherByCity(cityName: self.cityName ?? "")
        self.view.backgroundColor = UIColor(red: 56/255.0, green: 110/255.0, blue: 185/255.0, alpha: 1.0)
        self.closeButton.tintColor = UIColor(red: 0/255.0, green: 20/255.0, blue: 20/255.0, alpha: 1)

    }

    @IBAction func closeAction(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
}
extension WeatherDetailViewController: WeatherDetailView {
    func showWeatherSuccessful() {
        print("Success")
    }

    func showWeatherFailure() {
        print("Failure")
    }
}

1 Ответ

1 голос
/ 18 июня 2020

Обновите данные выборки с завершением

func fetchWeather(cityName: String,completionHandler: @escaping (WeatherModel?) -> Void){

        let weatherURL = "https://api.openweathermap.org/data/2.5/weather?q=\(cityName)&appid=55dbb1b10e9f55181ad910227f1460ae&units=metric"
        let objectURL = URL(string: weatherURL)
        let task = URLSession.shared.dataTask(with: objectURL!, completionHandler: {(data,reponse,error)in
            if error != nil{
                print(error!)
            } else{
                do{
                    let json = try JSONDecoder().decode(CityWeatherInfo.self, from: data!)
                    print(json)
                    let saveData: WeatherModel = WeatherModel(name: json.name,
                    temp: json.main.temp, feelsLike: json.main.feelsLike,
                    tempMin: json.main.tempMin, tempMax: json.main.tempMax,
                    main: json.weathers[0].main, description: json.weathers[0].main)
                    print(saveData)

                    completionHandler(saveData)

                } catch{
                    completionHandler(nil)
                    print("error")
                }
            }
        })
        task.resume()
    }

Как использовать

class WeatherDetailViewController: UIViewController {

    var weatherPresenter: WeatherDetailPresenter?
    public var cityName: String?

    let request = RequestManager()

 override func viewDidLoad() {
        super.viewDidLoad()
      request.fetchWeather(cityName: "", completionHandler: { [weak self] weatherModel in
                // here you get object and you can set labels

                self?.tempMinLabel.text =  weatherModel.tempMin
                self?. tempMaxLabel.text =  weatherModel.tempMax
               //....
            })
     }
}
...