【问题标题】:SWIFT decodable data transferSWIFT 可解码数据传输
【发布时间】:2018-06-30 05:54:52
【问题描述】:

我在 viewController 中有一个 usernameTextField,我在其中输入用户名和按钮 searchTapped,代码如下:

@IBAction func searchTapped(_ sender: UIButton) {
        guard let username = usernameTextField.text, username != "" else {
            displayWarningLabel(withText: "Information is incorrect")
            return
        }

        guard let gitUrl = URL(string: "https://api.github.com/users/\(username)/gists") else { return }
        URLSession.shared.dataTask(with: gitUrl) { (data, response, error) in

            guard let data = data else { return }
            guard error == nil else { return }
            do {
                let gitData = try JSONDecoder().decode([Gists].self, from: data)
                DispatchQueue.main.async {
                    self.gists = gitData
                }
            } catch let error {
                print(error)
            }
            }.resume()

        performSegue(withIdentifier: "GistsSegue", sender: nil)
    }

从 json 获取数据后,我想将数据保存到此方法之外的数组 gists 中,但这不会发生。

 var gists = [Gists]()

可能是什么问题?

以防万一,这是我解析 json 的模型:

struct Gists: Codable {
    var description: String?
    var files: [String: DetailGist]
}

struct DetailGist: Codable {
    var filename: String?
    var raw_url: String?
}

【问题讨论】:

  • 显示 JSON 响应
  • 你有什么想法?什么gitData不是数组?

标签: arrays json swift parsing


【解决方案1】:

self.gists = gitData 正在被调用,但在您调用 performSegue 之后很久才会调用它。这就是异步数据访问的本质。

只需将您的performSegue 调用移动到您设置self.gists 之后。

DispatchQueue.main.async {
    self.gists = gitData
    performSegue(withIdentifier: "GistsSegue", sender: nil)
}

【讨论】:

  • 我移动了方法performSegue(withIdentifier:sender:),但没有帮助...数组self.gists = gitData中的数据仍然没有保留
  • 那条线甚至被调用了吗?使用调试器,看看发生了什么。也许您的guard 语句之一正在返回。
  • 我明白了问题所在。我的 segue 没有直接访问第二个视图控制器,而是通过 UINavigationController。我修复了方法prepare(for segue:,一切正常override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let dvc = segue.destination as? UINavigationController { if let targetController = dvc.topViewController as? GistsViewController { targetController.username = self.username targetController.gists1 = gists } } }
猜你喜欢
  • 2018-12-07
  • 2022-01-22
  • 2022-01-21
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
相关资源
最近更新 更多