私はサーバーから取得したデータをJSONで解析しています。だから、私はURLセッションを持っています。このデータは、受信した辞書のキーと同じ構造体を使用するため、正しく解析されますが、このデータをこのオブジェクトに変換すると、このオブジェクトを保存できません完了ハンドラのスコープ外の配列完了ハンドラの値/オブジェクトをその外にある配列に取得します
使用機能:
fileprivate func loadColor(_ urlString: URL?, completionHandler: @escaping (Color) -> Void) {
if let url = urlString {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error)
} else {
do {
if let data = data,
let color = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
guard let color2 = Color(json: color) else
{
fatalError("something didn't go as planned")
}
completionHandler(color2)
}
} catch {
print("Error deserializing JSON: \(error)")
}
}
}
task.resume()
}
}
私は(のviewDidLoadでこのメソッドを呼び出した)、このような配列にそれを取得しよう:私は色の配列にそれを追加実行すると
var colors : [Color] = []
override func viewDidLoad() {
super.viewDidLoad()
loadColor(URL(string: "API command here"), completionHandler: { color in
self.colors.append(color)
print("\(self.colors.count)")
})
print("\(self.colors.count)")
}
カウントを出力するときに0から1になるので、配列に追加しますが、この完了ハンドラのスコープの外に出ると、配列は再び空になります。 私は何が欠けていますか?
アレイを更新していますが、ネットワークコードが非同期で完了しているため、値がネットワークから取得されてアレイに追加される前にアレイを印刷しています。クロージャー内のコードから配列内の値にアクセスするか、クロージャーによって呼び出されるだけです。 – Paulw11
それでは、これをどうやって修正するべきですか?何らかの待機方法を実行する必要がありますか? – symenize
いいえ、私が言ったように、あなたが閉鎖か閉鎖から呼び出す関数のいずれかで配列と何をする必要があれば何でもしてください。 – Paulw11