问题描述
我很容易猜测您正在遇到并发问题。在异步调用DarkSkyClient返回之前,您可能正在尝试访问对象的属性(如果我弄错了,请提前道歉)。即事件的顺序是…
因此,您真正需要做的是切换到控制模式的反转:
class Weather {
var temp: Float
var condition: String
var wind: Float
var precip: Float
init(forecast: Forecast) {
temp = (forecast.currently?.temperature)!
condition = (forecast.currently?.summary)!
wind = (forecast.currently?.windSpeed)!
precip = (forecast.currently?.precipitationProbability)!
}
static func getWeather() {
DarkSkyClient(apiKey: "<api key>").getForecast(latitude: Utils().getLat(), longitude: Utils().getLong()) { result in
switch result {
case .success(let currentForecast, _):
let weather = Weather(forecast: currentForecast)
// display the weather somewhere
doSomethingWith(weather: weather)
case .failure(let error):
print(error)
}
}
}
}
如果您不熟悉使用异步API进行开发,则值得您花些时间来阅读该主题;这可能非常棘手(可悲的是,我对好的入门书没有任何建议)。希望这可以帮助!
解决方法
好了,那么,从这里开始,这里是我的代码:
import UIKit
import ForecastIO
class Weather {
var temp: Float
var condition: String
var wind: Float
var precip: Float
init() {
DarkSkyClient(apiKey: "<api key>").getForecast(latitude: Utils().getLat(),longitude: Utils().getLong()) { result in
switch result {
case .success(let currentForecast,_):
self.temp = (currentForecast.currently?.temperature)!
self.condition = (currentForecast.currently?.summary)!
self.wind = (currentForecast.currently?.windSpeed)!
self.precip = (currentForecast.currently?.precipitationProbability)!
case .failure(let error):
print(error)
}
}
}
}
因此出现错误,因为我试图在API调用中初始化temp。我知道这不是最可靠的方法,但我正在尝试首先使其起作用。
第一个错误是:
在初始化所有成员之前,闭包捕获了“自我”
在线上 DarkSkyClient(apiKey: "").getForecast(latitude: Utils().getLat(),longitude: Utils().getLong()) { result in
我的第二个错误:
从初始化程序返回而不初始化所有存储的属性
在倒数第二 }
现在,显然我没有初始化正确。但是,我找不到执行最终目标的正确方法。也许我这样做完全错误?