代码之家  ›  专栏  ›  技术社区  ›  user7225129

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

  •  0
  • user7225129  · 技术社区  · 8 年前

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

    然而,当我在第二个视图控制器中测试此函数以打印它已到达的数据时,打印语句行出现崩溃。

    以下是位于模型类文件中的API调用函数的代码:

    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.
    
        }
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Cali Castle    8 年前

    如果坠机事件表明 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.")
        }
    }