有人可以修复我的功能代码,因为我已经创建了一个API调用函数,它将为我的类中的特定对象获取imageURL,并在第二个视图控制器中显示结果。我创建了自定义完成处理程序,以便第二个VC的代码仅在完成imageURL的下载时执行。
然而,当我在第二个视图控制器中测试此函数以打印它已到达的数据时,我在打印语句行上出现了崩溃。
以下是位于Model类文件中的API调用函数的代码:
$products = DB::table('products as p')
->join('manufacturers', 'manufacturers.id', '=', 'p.productManufacturerID')
->join(DB::raw('SELECT *
FROM `product_options`
GROUP BY productID'),function($join){
$join->on('product_options.productID', '=', 'p.id');
})
->select('p.productSKU', 'p.productName','p.productPrice',
'p.productSize','p.productDescription','p.productQuantity',
'manufacturers.brandName')
->where('p.productCategoryID', $category->id)
->get()->toArray();
在第二个视图控制器中,我只测试是否可以访问代码块:
func parseImageData(finished: () -> Void) {
let urlPath = _exerciseURL
let url = URL(string: urlPath!)
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print("Error while parsing JSON")
}
else {
do {
if let data = data,
let fetchedImageData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
let images = fetchedImageData["results"] as? [[String: Any]] {
for eachImage in images {
let imageUrl = eachImage["image"] as! String
self._imageUrl = URL(string: imageUrl)
}
print(self._imageUrl)
}
}
catch {
print("Error while parsing data.")
}
}
}
task.resume()
finished()
}
答案 0 :(得分:0)
如果崩溃说明force unwrapping nil
,那可能是因为let task = URLSession.shared.dataTask(with: url!)
正在展开url
这里的nil
可选变量。
但无论如何,你的完成处理程序都在错误的位置调用,请尝试将finished()
回调放入do
语句中。因为finished
在您致电exercise.parseImageData()
if error != nil {
print("Error while parsing JSON")
}
else {
do {
if let data = data,
let fetchedImageData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
let images = fetchedImageData["results"] as? [[String: Any]] {
for eachImage in images {
let imageUrl = eachImage["image"] as! String
self._imageUrl = URL(string: imageUrl)
}
print(self._imageUrl)
finished()
}
}
catch {
print("Error while parsing data.")
}
}