当从不同的VC访问时,具有完成处理程序的API调用函数崩溃

时间:2017-11-28 11:26:33

标签: ios json swift completionhandler

有人可以修复我的功能代码,因为我已经创建了一个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()
}

1 个答案:

答案 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.")
    }
}