TIL - 2021.05.13 (Thu)


野熊営房休み期間TIL Notion->移転Verlog復習!

ビュー/ロードユニット画像の再使用の遅延


prepareForReuse()


まず、ビューを再使用するためには、再使用したセルのテキストや画像などをすべて削除する必要があります.
実装されたPrepareForReuse()メソッドを再定義して使用します.
class myCell: UITableViewCell {
  ...
    
  override func prepareForReuse() {
		
  }
}  
しかしTable ViewDataSourceメソッドでCellを定義すればよいのではないでしょうか.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = self.tableView.dequeReusableCell(withIdentifier: "ListCell")!
  if indexPath.row == 2 {
  	cell.backgroundColor = .systemRed
  } else {
    cell.backgroundColor = .systemBackground
  }
  // else를 통해 해주지 않으면 index가 2가 아니여도 cell이 재사용되면서 빨간색이 cell에 들어갈 수 있다.
}
tableViewのセルを再使用する際の定義の違いは?
cellの作成から定義
cellの導入による構成の違いが大きい
後者はロード後に完了するプロセスで、複雑で時間のかかる作業であれば、大きな負荷が発生する可能性があります!!!

サーバからイメージとデータを取得します。


サーバからデータを受信してcellに入れると、いくつかの問題が発生します.
たとえば

上記のようにcellであり、各cellの色がサーバから受信されて表示されている場合...
  • ユーザーがすばやくスクロールします.
  • ブルーから消失し、白の底に再使用し、細胞が再び現れた.
  • サーバからデータを受信するのは、適切なindexPathに入る前に、一時的に再利用される前の色が表示される時間のかかるタスクです.
  • 説明しにくい記録...
    再温アクティビティ学習<ビューの再使用/セル画像の遅延ロード>1:05:20

    解決策


    1.データプリフェッチを使用して事前にデータを受信し、遅延がなく、インデックスによく入ります!
    勉強してから...更新
    2.DataTaskタスクが完了したら、CompletionHandlerでindexPathが同じかどうかをcapture listで検証し、->UIに入れればよい
    ARCを勉強していた時に習ったcapture listについて考えてみましょう!!
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        
        if indexPath.row == 0 {
          URLSession.shared.dataTask(with: URL(string: "https://wallpaperaccess.com/download/europe-4k-13691201")!) {
            data, reponse, error in
            let image = UIImage(data: data!)
            DispatchQueue.main.async {
              guard let cellIndex = tableView.indexPath(for: cell), cellIndex == indexPath else {
                return
              }
              cell.imageView?.image = image
            }
          }.resume()
        }
        
     return cell
    }
    追加:UI関連のタスクはmain Threadで完了する必要があります!!