【发布时间】:2021-02-26 13:13:00
【问题描述】:
我正在尝试从 URL 中恢复数据集(通过 parseJSON 函数解析 JSON 后,该函数正常工作 - 我没有将其附加到下面的 sn-p 中)。
结果返回 nil - 我相信这是因为 retrieveData 函数中的闭包是异步处理的。我无法将结果保存到 targetData。
提前感谢您的帮助。
class MyClass {
var targetData:Download?
func triggerEvaluation() {
retrieveData(url: "myurl.com") { downloadedData in
self.targetData = downloadedData
}
print(targetData) // <---- Here is where I get "nil"!
}
func retrieveData(url: String, completion: @escaping (Download) -> ()) {
let myURL = URL(url)!
let mySession = URLSession(configuration: .default)
let task = mySession.dataTask(with: myURL) { [self] (data, response, error) in
if error == nil {
if let fetchedData = data {
let safeData = parseJSON(data: fetchedData)
completion(safeData)
}
} else {
//
}
}
task.resume()
}
}
【问题讨论】:
-
谢谢队友-我应该在闭包内使用 DispatchQueue.main.async 吗?即:func triggerEvaluation(){retrieveData(url:“myurl.com”){Dispatchqueue.main.async中的下载数据{self.targetData =下载数据打印(目标数据)}}}
-
还有:如何将填充的“targetData”变量传递给视图?我应该采用协议委托结构吗?我在问,如果我只是创建这个类的一个实例并从视图访问该属性,它的结果是 nil (假设出于相同的原因)。谢谢!
-
“如何将填充的“targetData”变量传递给视图?” ...通常您只需将数据提供给视图,从而更新必要的 UI 控件。不需要协议委托,但如果视图允许用户输入,那么该模式可能非常有用,并且您需要将用户输入数据反映回模型、Web 服务等。
标签: swift asynchronous urlsession nsurlsessiondatatask