微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在初始化所有成员之前,闭包捕获了“自我”

如何解决在初始化所有成员之前,闭包捕获了“自我”

我很容易猜测您正在遇到并发问题。在异步调用DarkSkyClient返回之前,您可能正在尝试访问对象的属性(如果我弄错了,请提前道歉)。即事件的顺序是…

  1. 初始化天气对象,将temp设置为0
  2. 开始调用DarkSkyClient,在后台运行
  3. 读取temp变量-嘿,它是0!
  4. 调用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

我的第二个错误:

从初始化程序返回而不初始化所有存储的属性

在倒数第二 }

现在,显然我没有初始化正确。但是,我找不到执行最终目标的正确方法。也许我这样做完全错误?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。