2017-04-19 35 views
0

我有一個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。

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是相同的第一代碼。我發起一個任務並等待,直到使用信號量得到結果。

+0

你不是在任何地方調用task.resume() –

+0

我這樣做是在上面的代碼之後。我認爲這裏沒有必要包含它。 – user2232305

+1

jsonData是一個字典或數組的錯誤名稱 –

回答

0

你說你的閉包不會完成執行,你還提到你在沒有發佈的代碼中某處使用了一個信號量。很有可能您錯誤地使用了信號量,並且阻止了您的線程。

問題中沒有什麼可以看到首先使用信號量的權證。通過引入信號量和異常,你似乎正在使代碼的方式變得比必要的複雜。

我建議你閱讀如何單元測試代碼,並建立你的邏輯一次一點。看起來你現在咬的比現在嚼的還多。