TIL(Today I Learned)

1월 21일(목)

학습내용

  • 테이블뷰 셀은 컨베이어 벨트처럼 회전하면서 재사용된다. 화면에 보이지 않는 셀은 큐에서 대기하고 있고 화면에 보여야할때 큐에서 나와서 보여주게된다. 그리고 다시 스크롤하여 화면에서 사라지면 셀이 큐에 들어가게 된다.
  • 테이블뷰 셀의 재사용성으로 인해 셀에 잘못된 값이 나타나는 문제가 발생할 수 있다.
    • 이전에 들어갔던 내용이 큐에 들어갔을때 초기화되지 않아서 발생하는 문제이다.
    • UITableViewCell의 prepareForReuse 메소드를 오버라이드하여 콘텐츠들을 초기화시켜줌으로써 해결할 수 있다.
  • 테이블뷰 셀의 재사용성과 동시성 프로그래밍으로 인해 셀에 잘못된 값이 나타나는 문제가 발생할 수 있다.
    • 비동기적으로 데이터를 받아오기 때문에, 데이터가 다 받아온 시점과 데이터를 요청한 시점의 셀 위치가 바뀌면서 발생하는 문제이다.
  • UI 업데이트는 메인 쓰레드에서만 해야 한다.

문제점/고민한점

  • prepareForReuse에서 리셋하는 것과 dequeue 했을 때 리셋하는 것의 차이는?
  • 테이블뷰 셀의 재사용성과 동시성 프로그래밍으로 인해 셀에 잘못된 값이 나타나는 문제는 어떻게 해결할 수 있을까?

해결방법

  • prepareForReuse에서 리셋하는 것과 dequeue 했을 때 리셋하는 것의 차이는?
    • 셀 내부에서 직접 초기화하므로 안전하다.
    • prepareForReuse를 사용할 경우 코드 분리 (기능 분리)의 이점이 있다.
    • 셀이 여러 종류일 경우. 이를 초기화 하기 위해 뷰컨트롤러 내부에서 분기해서 초기화해주는 것은 복잡하다.
    • prepareForReuse는 성능상의 이점이 있다. 셀이 사라진 후에 재사용을 준비하므로. dequeue한 후에 리셋하는 것보다 더 빠르다.
  • 테이블뷰 셀의 재사용성과 동시성 프로그래밍으로 인해 셀에 잘못된 값이 나타나는 문제는 어떻게 해결할 수 있을까?
    • 셀 위치가 바뀐다면 이전에 데이터를 요청했던 작업을 중지하면 될 것 같다. 바뀌지 않았으면 그대로 셀을 업데이트 한다.
    • 만약 작업을 중지할 수 없다면, 데이터를 다 받아온 시점의 셀 위치가 시작했던 셀 위치가 동일할 때만 셀 내용을 업데이트하도록 하면 될 것 같다.