Swift 转义函数

Swift escaping function

我遵循了 youtube 上的教程如何从 json 获取数据,但我不理解所有步骤。 这是函数:

 func downloadJSON (completed: @escaping () -> ()) {
    
    let url = URL (string: "https://api.github.com/repos/\(details!.full_name)/readme")
    URLSession.shared.dataTask(with: url!) { (data, response, error) in
        
        if error == nil {
            do {
                self.read = try JSONDecoder().decode(Readm.self, from: data!)
                DispatchQueue.main.async {
                    completed()
                }
            }catch {
                print (error)
            }
        }
    }.resume()
}

}

我就是这样称呼它的

 downloadJSON {
        if let content = self.read?.content {
            self.textViewScroll.text = self.base64Decoded(word: content)
        }

我看到我正在使用@escaping,如果我做对了,viewDidLoad 中的“downloadJson”会在 func 之后调用吗? DispatchQueue.main.async 中的“completed()”是什么意思? 如果有人可以根据此示例帮助我进行解释,我将不胜感激。谢谢!

您的闭包“完成”转义到 DispatchQueue.main.async { ... } 中的其他闭包。

它被转义是因为它属于其他对象(转义到它),在这种情况下是其他闭包。

你调用downloadJSON有误

         func downloadJSON (completed: @escaping (Bool) -> ()) {
            
            let url = URL (string: "https://api.github.com/repos/\(details!.full_name)/readme")
            URLSession.shared.dataTask(with: url!) { (data, response, error) in
                
                if error == nil {
                    do {
                        self.read = try JSONDecoder().decode(Readm.self, from: data!)
                        DispatchQueue.main.async {
                            completed(true)
                        }
                    }catch {
                        completed(false)
                    }
                }
            }.resume()
        }
    

那么调用func就是:

    func downloadJSON()
    {
        [weak self] (result) in
        guard let self = self else {return}
        if result
        {
         if let content = self.read?.content {
         self.textViewScroll.text = self.base64Decoded(word: content)}
        }
        else
        {
          print("error")
        }
    }