ios - 如何使用 completionHandler 将元素附加到数组?
问题描述
我有一个 getJson 函数,用于将 URLSession 中的 json 解析为 HouseDetails 数组。
func getJson(completion: @escaping ([HouseDetails]?, Error?) -> Void) {
var result: [HouseDetails] = []
let jsonUrlString = "https://data.melbourne.vic.gov.au/resource/i8px-csib.json"
guard let url = URL(string: jsonUrlString)
else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
if let error = error {
DispatchQueue.main.async {
completion(nil, error)
}
return
}
do {
let houses = try JSONDecoder().decode([HouseDetails].self, from: data)
for h in houses {
result.append(h)
}
DispatchQueue.main.async {
completion(result, error)
}
}
catch let jsonErr {
print("Error with json serialization", jsonErr)
}
}.resume()
}
然后我从这里的主 viewDidLoad() 函数调用这个函数:
getJson { (x, error) in
guard let x = x, error == nil else {
return
}
hsArray = x
}
但是,当我将 hsArray (它是 [HouseDetails] 的全局数组分配给答案时,没有添加任何内容。再一次,如果我循环遍历我调用 getJson 的“x”变量,我可以看到所有值在那里。所以我相信这仍然是一个异步问题。感谢您的帮助。
解决方案
推荐阅读
- r - 在 R 中使用逻辑检查加速循环
- laravel - Laravel 推送通知由带有同步但不与 redis 驱动程序的推送器接收
- python - 我正在关注“以艰难的方式学习 python 3”,在练习 13 中我搞砸了
- python - 在函数变量中出现奇怪的错误
- javascript - 格式数字始终显示固定小数点,最多 4 位小数?
- azure - 您可以从 Azure 队列触发器中弹出消息吗
- java - Mockito 调用主类的方法
- python - 如何在python中将数字缩写(1.70 M,1.600 B,2.1M)转换为整数
- javascript - 开关 - 添加或删除图层
- asp.net-core - 无法在 ASP.NET Core Web API 中上传图像文件 - POST 方法