我正在尝试使用AlamoFire构建一个天气应用程序,我得到了预期的JSON响应,但当我试图将日期更新为UI标签时,我的变量返回了一个nil。如果有人有机会让我知道我哪里错了
import UIKit
class WeatherVC: UIViewController {
@IBOutlet weak var dateLbl: UILabel!
@IBOutlet weak var weatherType: UILabel!
@IBOutlet weak var cityname: UILabel!
@IBOutlet weak var currentTemp: UILabel!
var weatherConstants = WeatherConstant()
override func viewDidLoad() {
super.viewDidLoad()
// updateUI()
//
weatherConstants.downloadCurrentWeather {
self.updateUI()
}
weatherConstants = WeatherConstant()
print(Current_Weather_Url)
}
func updateUI() {
weatherType.text = weatherConstants.weatherType
cityname.text = weatherConstants.cityName
print("current city name is \(weatherConstants.weatherType)")
}
}天气常量
import UIKit
import Alamofire
class WeatherConstant {
var _cityName :String!
var _currentTemp : Double!
var _weatherType : String!
var _highTemp : String!
var _date :String!
var cityName :String {
if _cityName == nil {
_cityName = ""
}
return _cityName
}
var currentTemp : Double{
if _currentTemp == nil {
_currentTemp = 0.0
}
return _currentTemp
}
var weatherType : String {
if _weatherType == nil {
_weatherType = ""
}
return _weatherType
}
var highTemp : String {
if _highTemp == nil {
_highTemp = ""
}
return _highTemp
}
var date : String {
if _date == nil {
_date = ""
}
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
let currentDate = dateFormatter.string(from: Date())
self._date = "Today, \(currentDate)"
return _date
}
//func downloadWeatherDetails(completed : DownloadComplete) ===> downloadWeatherDetails(completed : @escaping DownloadComplete)
func downloadCurrentWeather(completed: @escaping DownloadComplete) {
Alamofire.request(Current_Weather_Url).responseJSON{ response in
let result = response.result
// print(result)
debugPrint(result)
if let dict = result.value as? Dictionary<String, AnyObject>{
if let name = dict["name"] as? String {
self._cityName = name
print("current name is \(self._cityName)")
}
if let currentTemp = dict["weather"] as? [Dictionary<String, AnyObject>] {
if let main = currentTemp[0]["main"] as? String{
self._weatherType = main
print("Current Weather Type \(self._weatherType)")
}
}
}
completed()
}
}
}JSON响应
https://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=e9a34088739f38c517b4a45084f5ed82
SUCCESS: {
base = stations;
clouds = {
all = 0;
};
cod = 200;
coord = {
lat = "35.02";
lon = "139.01";
};
dt = 1485792967;
id = 1907296;
main = {
"grnd_level" = "1013.75";
humidity = 100;
pressure = "1013.75";
"sea_level" = "1023.22";
temp = "285.514";
"temp_max" = "285.514";
"temp_min" = "285.514";
};
name = Tawarano;
sys = {
country = JP;
message = "0.0025";
sunrise = 1485726240;
sunset = 1485763863;
};
weather = (
{
description = "clear sky";
icon = 01n;
id = 800;
main = Clear;
}
);
wind = {
deg = 311;
speed = "5.52";
};
}当前天气类型可选(“Clear”)->这是我试图提供给UIlabel的天气类型
当前城市名称是可选的(“”)->这里我尝试打印UILabel中的数据,但返回的是空字符串
2018-08-07 11:18:09.567868-0700WeatherApp1.182321:3248301函数boringssl_session_errorlog:第2881行boringssl_session_read SSL_ERROR_ZERO_RETURN(6):操作失败,因为连接已被干净地关闭并显示close_notify警报
发布于 2018-08-08 04:47:49
您正在用viewDidLoad中的新对象覆盖weatherConstants值。试着去掉它。
(更长的解释:您正确地创建了一个weatherConstants对象,并请求它获取数据。但在此过程中,您创建了该对象的第二个实例,该实例将覆盖第一个实例。因此,当第一个实例完成网络请求并告诉您的UI重绘时,UI从第二个WeatherConstants实例获取数据)
https://stackoverflow.com/questions/51734040
复制相似问题