我試圖訪問變量pic
在請求後,但它在封閉,這就是爲什麼print(pic)
不起作用。Swift3 - 如何訪問變量在封閉
有人會如何去訪問這個?
guard let url = URL(string: "myurl") else{ return }
var pic = ""
let session = URLSession.shared
session.dataTask(with: url) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
print(data)
do {
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
pic = parseJSON["picture"] as! String
print(json!)
}
} catch {
print(error)
}
}
}.resume()
print(pic)
}
您必須在閉包的範圍外聲明一個變量,並將閉包內的值賦值給該變量。但是,由於您正在處理網絡請求,因此閉包實際上是一個完成處理程序,只有在異步請求完成後纔會立即返回,因此在完成塊之後立即打印值仍然無效。查看Swift中完成處理程序和異步函數的工作方式 –
這是一個計時問題。 'print(pic)'語句是在'dataTask'的異步完成處理程序關閉有機會運行之前執行的。底線,請記住閉包異步運行,所以不要試圖在閉包之外立即使用結果。通常你會從封閉內發送UI更新到主隊列中,或者更好的是自己採用完成處理器模式。 – Rob