gpt4 book ai didi

ios - 使用 URLSession 从另一个类调用时,属性变为空

转载 作者:行者123 更新时间:2023-11-30 11:28:01 24 4
gpt4 key购买 nike

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

显示的打印语句将给出我正在寻找的内容,但是当我在调用检索方法后尝试在另一个类中使用该属性时,它会显示为空。

仅供引用,“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()
}
}

最佳答案

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

你基本上有 3 个选择:

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

  2. 将您的类更改为具有委托(delegate)属性,您可以在 URL 请求完成时对其执行 ping 操作。

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

我个人倾向于选项 3:

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

关于ios - 使用 URLSession 从另一个类调用时,属性变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com