出于某种原因,当我尝试从另一个类访问它时,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()
}
}
答案 0 :(得分:0)
正如maddy所说,这是因为URL调用是异步的。
你基本上有3个选择:
使用信号量方法并使retrieveProductList方法同步。
将您的类更改为具有可在URL请求完成时ping通的委托属性。
在URL请求完成时调用的retrieveProductList方法中添加一个完成处理程序。
我个人倾向于选择3:
func retrieveProductList(completion: @escaping ([Product])->())
{
// Right after you print the products...
completion(self.products)
}