当使用URLSession

时间:2018-05-25 22:31:07

标签: ios swift nsurlsession

出于某种原因,当我尝试从另一个类访问它时,products数组将返回空白。我做错了什么,如何让产品阵列填充?它与do / catch有关吗?

显示的print语句将为我提供我正在寻找的内容,但是当我在调用retrieve方法后尝试在另一个类中使用该属性时,它会显示为空。

有关信息,“Product”是附加了名称,描述等属性的结构。

private let productListUrl = URL(string: "https://api/products.json")
var products = [Product]()

func retrieveProductList() {
    if let productListUrl = productListUrl {
        URLSession.shared.dataTask(with: productListUrl) { (data, response, error) in
            if let data = data {
                do {
                    let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as! [String:Any]
                    let tempArray: Array = jsonData["products"] as! [Any]
                    for product in tempArray {
                        let newProduct = Product(json: product as! [String : Any])
                        self.products.append(newProduct!)
                    }
                    print("In ProductService: \(self.products)")
                }
                catch {
                    print("An error occured while attempting to read data")
                }
            }
        }.resume()
    }
}

1 个答案:

答案 0 :(得分:0)

正如maddy所说,这是因为URL调用是异步的。

你基本上有3个选择:

  1. 使用信号量方法并使retrieveProductList方法同步。

  2. 将您的类更改为具有可在URL请求完成时ping通的委托属性。

  3. 在URL请求完成时调用的retrieveProductList方法中添加一个完成处理程序。

  4. 我个人倾向于选择3:

    func retrieveProductList(completion: @escaping ([Product])->())
    {
        // Right after you print the products...
        completion(self.products)
    }