首页 > 解决方案 > 如何使用 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”变量,我可以看到所有值在那里。所以我相信这仍然是一个异步问题。感谢您的帮助。

标签: iosswiftasynchronouscompletionhandlerurlsession

解决方案


推荐阅读