ProductListCell과 DetailViewController의 이미지를 불러오기 위해 아래와 같은 원시적인 방법을 사용했다.
DispatchQueue.global().async {
if let data = try? Data(contentsOf: imageURL), let image = UIImage(data: data) {
DispatchQueue.main.async {
self.productImageView.image = image
}
}
}
이 코드는 일단 동작은 하지만, 실제 앱 환경에서 사용하기에는 다음과 같은 문제점들을 가지고 있었다.
UITableView는 스크롤시 재사용된다.Data(contentsOf:)는 동기함수로, 데이터 수신이 완료될 때까지 해당 스레드를 차단한다.global() 스레드에서 실행하여 앱이 멈추지는 않지만 현대적인 비동기 처리방식은 아니라고 한다.URLSession을 사용하여 비동기적으로 이미지를 다운로드하고, NSCache를 사용하여 메모리 및 디스크 캐시 시스템을 직접 구축하는 방식.Kingfisher 라이브러리를 사용하기로 결정했다.
직접 구현하는 방식의 학습적 가치도 있지만, 개인적인 프로젝트의 목표는 "완성하고 개선하기"이다.
Kingfisher를 사용함으로써 얻는 개발 시간 단축, 성능 및 안정성 확보라는 이점이 "외부 의존성 추가"라는 단점을 압도적으로 상회한다고 판단했다.