簡體   English   中英

URLSession.shared.dataTask的完成處理程序內部的閉包

[英]closure inside completion handler of URLSession.shared.dataTask

我在URLSession.shared.dataTask任務內調用了閉包。 關鍵是,當我在閉合中設置斷點時,它不會完成執行。

func query(url: String, args: [String:String], completion: @escaping (_ data: Data) -> Void) {
// Create request url in order to query API.
let url = makeGetRequestUsing(url: url, args: args)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    guard let data = data, error == nil else {
        print("error:", error ?? "")
        return
    }
    completion(data)
}

task.resume()

這就是我所說的。

self.comments = []
api.query(url: url, args: args) { data in
    let jsonData = try! JSONSerialization.jsonObject(with: data)
    print(String(data: data, encoding: .utf8))
    if let jsonArray = jsonData as? [[String: Any]] {
        // Create comments from the json received.
        for i in 0..<jsonArray.count {
            do {
                self.comments.append(try Comment(json: jsonArray[i]))
            } catch {
                print(error)
            }
        }
        DispatchQueue.main.async {
            self.refreshComments()
        }
    }
}

我已經在完成處理程序中設置了一個斷點,看來該錯誤來自Comment類的初始化。

init(json: [String: Any]) throws {
// Get the comment text.
guard let comment = json[Comment.commentText] as? String else {
  throw SerializationError.missing(Comment.commentText)
}

// Get userImage.
guard let userId = json[Comment.userId] as? Int,
  let userImage = APIData.shared.getImage(url: "/userImageForId", args: ["id": String(userId)]) else {
    throw SerializationError.missing(Comment.userId)
}

// Get userename.
guard let resp = APIData.shared.getQuery(url: "/userNameForId", args: ["id": String(userId)]) as? [String: String],
  let username = resp[Comment.username] else {
    throw SerializationError.missing(Comment.username)
}

self.comment = comment
self.username = username
self.userImage = userImage

}

getImage和getQuery與第一個代碼相同。 我啟動一個任務,然后等待直到使用信號量獲得結果為止。

您說您的關閉操作無法完成執行,您還提到您在尚未發布的代碼中使用信號燈。 您極有可能錯誤地使用了信號量,從而阻塞了線程。

我能看到的問題沒有什么可以證明的是首先要使用信號量。 通過引入信號量和異常,您似乎使代碼變得比必需的更加復雜。

我建議您一次閱讀一些有關如何對代碼進行單元測試並逐步建立自己的邏輯的知識。 看來您現在正在咬的東西超出了您的咀嚼能力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM