tableView(_:cellForRowAt:)
の各UITableViewCell
の画像を遅延してダウンロードします。テーブルビューが画面に表示されると、各セルの点滅が止まりません。tableViewをスクロールできません。内の画像をダウンロードするtableView(_:cellForRowAt :)セルをノンストップで点滅させる点滅
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageCell
let row = indexPath.row
cell.content.delegate = self
cell.content.text = messages[row].content
cell.date.text = messages[row].createdDateStrInLocal
cell.messageOwner.text = messages[row].user
self.fetchUserAvatar(avatarName: messages[row].user, handler: ({ img in
cell.profileImageView.image = img
tableView.reloadRows(at: [indexPath], with: .automatic)
}))
return cell
}
fileprivate func fetchUserAvatar(avatarName: String, handler: @escaping (UIImage) -> Void){
guard !avatarName.isEmpty, let user = self.user, !user.isEmpty else { return }
let url = URL(string: self.url + "/userAvatarURL")
var request = URLRequest(url: url!)
let body = "username=" + user + "&avatarName=" + avatarName
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.httpBody = body.data(using: .utf8)
defaultSession.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
print(error!)
return
}
if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data, let urlStr = String(data: data, encoding: String.Encoding.utf8), urlStr != "NULL", urlStr.contains("http"), let url = URL(string: urlStr) {
self.defaultSession.dataTask(with: url, completionHandler:{ data, respone, error in
guard error == nil else {
print(error!)
return
}
DispatchQueue.main.async {
if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data, let img = UIImage(data: data) {
self.cacheImage.setObject(img, forKey: avatarName as NSString)
handler(img)
}
}
}).resume()
}
}).resume()
}
私はそれを削除すると、私は各セルに画像を表示することはできません。 –
答えを編集しました。もう1つの問題は、イメージを更新するときにセルレイアウトを更新しないことです。 –