【问题标题】:How do I pass Json Data from one class to another?如何将 Json 数据从一个班级传递到另一个班级?
【发布时间】:2020-10-08 19:20:06
【问题描述】:

谁能告诉我该怎么办?

我有一个名为 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”标签中,但无法从 RequestManager 进入“let saveData”。


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")
    }
}

【问题讨论】:

标签: ios json swift class mvp


【解决方案1】:

完成后更新您的获取数据

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
               //....
            })
     }
}

【讨论】:

  • 谢谢阿里。但我不知道你在 View Controller 中使用 fetchWeather 的 weatherData 是什么意思
  • 对,我需要 WeatherModel
  • 更新了我的答案...立即查看
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多