실시간으로 채팅방 데이터를 불러올 때 문제 발생
요구사항
- 채팅목록에서 채팅방에 새로운 메시지가 올 때 채팅방의 마지막 메시지와 읽지 않은 메시지 수가 실시간으로 업데이트되어야 함
- 채팅방에서 상대방과 채팅을 할 때 실시간으로 채팅이 오고 가는 것을 볼 수 있어야 함
문제 확인
- 채팅목록에서 채팅방 데이터가 모두 로딩되기 전에 UI가 그려지는 문제가 발생함
문제 분석
- 시도: CompletionHandler를 사용하여 데이터 로딩 후 UI가 그려지도록 했는데 순서가 보장되지 않음
- 원인: 마지막 메시지와 읽지 않은 메시지 로딩이 비동기적으로 작업되면서 완료되는 순서를 예측할 수 없게 됨
- 시도: Dispatch Group을 사용하여 마지막 메시지 로딩이 끝나면 읽지 않은 메시지 로딩을 실행하고 데이터가 모두 로딩되면 UI를 업데이트하도록 작업 순서를 제어했으나 crash가 발생함
- 원인: 디버깅을 해보니 데이터를 가져오고 CompletionHandler가 불리는 상황에서 문제가 발생하는 것을 확인함
- 원인: 실시간으로 마지막 메시지를 업데이트하기 위해 SnapshotListener를 사용하면서 listener가 등록되고, 이후에 읽지 않은 메시지를 업데이트하기 위해 또 SnapshotListener를 등록하면서 메모리 누수가 발생함
문제 해결
- 뷰가 나타날 때(viewWillAppear) 메시지를 가져오는 listener를 명시해주고, 뷰가 사라질 때(viewWillDisappear) listener를 메모리에서 해제해줌
- CompletionHandler를 사용하여 데이터를 로딩하는 코드를 async/await 코드로 리팩토링함으로써 코드의 가독성을 높임