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

API call function with completion handler crashes when accessed from different VC

有人可以修复我的函数代码吗,因为我已经创建了一个 API 调用函数,它将在我的 class 中获取特定对象的 imageURL 并在第二个视图控制器中显示结果。我创建了自定义完成处理程序,以便第二个 VC 中的代码仅在 imageURL 下载完成时执行。

但是,当我在第二个视图控制器中测试此功能以打印它已到达的数据时,我在打印语句行上遇到崩溃。

这是我的 API 调用函数的代码,位于模型 class 文件中:

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()
}

在第二个视图控制器中,我只是在测试我是否可以访问代码块:

override func viewDidLoad() {
    super.viewDidLoad()

    exercise.parseImageData() {
        print("Arrived Here?") // I am getting crash on this line moving to debug navigator.

    }

}

如果崩溃说明了 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.")
    }
}