본문 바로가기
트러블슈팅

TableView reloadData vs insertRows

by man_doo 2024. 7. 21.

사용 계기

이번에 회사에서 제품 개선을 하던 중 간헐적으로 크래시가 발생하는 문제가 있었습니다. 
TableView를 사용하여 UI를 구성했고, 특정 프로그램이 제대로 동작하지 않는 이유를 진단하는 프로그램입니다. 
진단을 시작하면 빠르게 진단 로그가 TableView에 업데이트됩니다. 기존에는 reloadData() 메서드를 통해 UI를 업데이트하고 있었는데, UI가 업데이트되는 동안 지속적으로 빠르게 데이터가 추가됐기 때문에 충돌이 발생했던 것입니다.

해결 방법

이러한 문제를 해결하는 과정에서 insertRows()라는 메서드를 알게 되었습니다.
tableView.beginUpdates()
tableView.insertRows(at: [newIndexPath], with: .automatic)
tableView.endUpdates()
 
테이블 뷰 업데이트를 시작할 때 tableView.beginUpdates()를 호출하고, 끝날 때 tableView.endUpdates()를 호출합니다. 두 메서드 사이에 테이블 뷰 셀을 업데이트하는 메서드를 넣어주면 됩니다.
insertRows() 메서드를 사용하면 선택한 특정 셀을 업데이트할 수 있습니다. 따라서 TableView에 보여줄 데이터와 UI가 틀어지는 문제를 방지할 수 있었고, 크래시가 발생하는 문제도 해결할 수 있었습니다.

insertRows의 장점

추가적으로 데이터가 빠르게 추가, 변경되는 상황에서 insertRows()를 사용하면 얻을 수 있는 장점이 있습니다.

1. UI 업데이트 속도 증가  

   실제 제품에서 테스트했을 때의 결과 일부를 가져왔습니다.
        - reloadData(): 약 2.1ms
        - insertRows(): 약 0.2ms
   보시는 것과 같이 빠르게 변화하는 데이터를 TableView에 업데이트할 때는 변화된 부분만 업데이트하는 insertRows()가 더 빠른 속도를 보여줍니다.

2. 메모리 사용량 감소

   데이터가 추가될 때마다 새로 모든 데이터를 업데이트하는 reloadData()에 비해 insertRows()가 더 적은 메모리를 사용하게 됩니다. 이는 TableView에서 보여주는 데이터가 많을수록 명확한 차이를 보여줍니다.

결론

데이터의 변경이 빠르지 않거나 특정 상황에서 데이터가 한 번에 많이 추가되는 상황이라면 reloadData()가 더 좋은 선택일 수 있습니다. 하지만 실시간으로 빠르게 추가되는 로그를 보여주는 상황처럼 UI 업데이트가 빈번하게 발생한다면 insertRows() 사용을 고려해보는 것도 좋은 선택지가 될 수 있을 것입니다.