【问题标题】:Can't change the struct instance value in closure [duplicate]无法更改闭包中的结构实例值[重复]
【发布时间】:2019-08-26 10:43:19
【问题描述】:

我有一个名为 users 的结构实例,我通过闭包将 JSON 解析到这个实例中,但我发现我的编辑根本没有保存。因此,当我超出关闭范围时,我没有。有人知道如何捕捉闭包中的价值吗?

var users: [User]! = [User]()

override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request(url2).responseJSON { response in
            switch response.result {
            case .success(let value):
                guard let jsonArray = value as? [[String: Any]] else { return }
                self.users = jsonArray.compactMap(User.init)
                print(self.users!) // works
            case .failure(let error):
                print(error)
            }
        }

        print(users!) // error because I had nil
}

【问题讨论】:

  • 问题是responseJSON是异步调用的,也就是说底部的print语句在你的回调函数被调用之前就已经执行了
  • 哇,你知道怎么解决吗?

标签: swift


【解决方案1】:

提出请求需要时间。为了避免整个应用程序冻结,请求在后台发送并且程序继续执行,即使它还没有收到服务器的响应。

解决此问题的一种方法是在加载数据后在回调中调用一个单独的函数。这可能如下所示:

var users: [User]! = [User]()

override func viewDidLoad() {
        super.viewDidLoad()

        Alamofire.request(url2).responseJSON { response in
            switch response.result {
            case .success(let value):
                guard let jsonArray = value as? [[String: Any]] else { return }
                self.users = jsonArray.compactMap(User.init)
                print(self.users!) // works

                // call function here!
                self.usersLoaded()
            case .failure(let error):
                print(error)
            }
        }
}

func usersLoaded() {
        print(users!)
}

【讨论】:

  • 哦,非常感谢!它有效
  • 很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多