2017-05-18 9 views
0

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() 
} 

答えて

3

これはセルに画像をダウンロードする安全な方法ではないという事実にもかかわらず、あなたはtableView.reloadRows(at: [indexPath], with: .automatic)を削除する必要があります。これは無限ループを引き起こします。

イメージが更新されたときに制約が更新されていることを確認してください。

+0

私はそれを削除すると、私は各セルに画像を表示することはできません。 –

+0

答えを編集しました。もう1つの問題は、イメージを更新するときにセルレイアウトを更新しないことです。 –

0

fetchUserAvatar別のバックグラウンドスレッドで作成します。完了ブロックで、メインスレッドに戻り、表のセルサムイメージを更新します。 `cellForRowAt indexPath:IndexPath。 'の内部でテーブルビューをリロードしないでください。すでにセルをリロードしているからです。

関連する問題