我在嘗試從 API 檢索和解碼 JSON 資料時遇到問題。我能夠從 API 獲取資料并成功解碼它,但我無法從函式范圍之外訪問它。我正在使用以下函式來獲取和解碼資料。API 回傳一組 JSON 物件。
func getJSON(completed: @escaping () -> ()) {
var jsonData = [API_data] () // A struct for retrieved data
let url = "URL Here" // I have the original URL here, which I can't share
let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { [self]data,response,error in
guard let data = data, error == nil else{
print("error")
return
}
do{
jsonData = try JSONDecoder().decode([API_data].self,from:data)
} catch{
print(error)
}
print(jsonData[0].id) // This prints my data
})
print(jsonData[0].id) // This won't print my data
task.resume()
}
struct API_data: Codable {
let id : String
}
因此,我無法在應用程式的任何地方使用這些資料。任何幫助將不勝感激。我也嘗試將 jsonData 設為全域變數,在函式中更新它并回傳它然后使用它,但仍然不起作用。
謝謝你的幫助。
uj5u.com熱心網友回復:
由于您已經有一個完成處理程式,請使用它并傳遞接收到的資料
func getJSON(completed: @escaping ([API_data]) -> Void) {
let url = "URL Here" // I have the original URL here, which I can't shar
let task = URLSession.shared.dataTask(with: URL(string: url)!) { data, _ , error in
if let error = error { print(error); return }
do {
completed(try JSONDecoder().decode([API_data].self,from:data!))
} catch{
print(error)
}
}
task.resume()
}
并使用它
getJSON { apiData in
print(apiData[0].id) // This prints my data
}
或者更舒服的Result型別
func getJSON(completed: @escaping (Result<[API_data],Error>) -> Void) {
let url = "URL Here" // I have the original URL here, which I can't shar
let task = URLSession.shared.dataTask(with: URL(string: url)!) { data, _ , error in
if let error = error { completed(.failure(error)); return }
Result { try JSONDecoder().decode([API_data].self,from: data!) }
}
task.resume()
}
getJSON { result in
switch result {
case .success(let apiData): print(apiData[0].id) // This prints my data
case .failure(let error): print(error)
}
}
uj5u.com熱心網友回復:
它是異步的,您可能希望在它準備好后稍后訪問它,例如通過使用完成處理程式。
uj5u.com熱心網友回復:
嘗試從您的 API 函式創建一個完成處理程式,并隨完成發送資料。并嘗試在那里使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/343489.html
