테이블 뷰 메모이제이션(memoization) 도 문제점이 있습니다.
데이터가 수십건, 수백건 이라면 화면 로딩이 지연(Blocking) 되는 문제가 생깁니다.
목록을 보여주는 앱이라면 첫 화면부터 대량의 정보를 보여줘야 하기때문에
처음 실행한 부분부터 화면이 보이지 않는다면 오류인줄 알고 앱을 종료해버리고 말것입니다.
거기에 텍스트보다 용량이 높은 이미지를 메모리에 저장까지 해야 하는 부담도 있습니다.
이를 해결하기위해 iOS에서 제공하는 법용 비동기 함수를 이용하는 것입니다.
DispathchQueue.main.async() 라는 비동기 실행 함수를 Swift에서 제공하고 있기 때문에
내부적으로 스레드에 직접 접근없이 비동기 처리를 할 수 있도록 지원합니다.
이 함수는 블록(Block) 과 GCD(Global Centeral Dispath) 를 이용하여 글로벌 범위에서 사용할 수 있고,
GCD는 애플의 기술로서 병렬처리와 스레드 풀의 기반인 비동기 방식을 구현함으로
멀티코어 프로세서에 적합한 앱을 개발할 수 있도록 지원합니다.
// 이미지 객체가 존재하면 리턴, 존재하지 않으면 새로 내려받아 저장 후 리턴 func getImage(_ index: Int) -> UIImage { let model = list[index] if let imageData = model.imageData { return imageData } else { let url: URL! = URL(string: model.imageUrl!) let data = try! Data(contentsOf: url) model.imageData = UIImage(data: data) return model.imageData! } } | cs |
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ... // 비동기 처리 DispatchQueue.main.async { cell.imgView.image = self.getImage(indexPath.row) } return cell } | cs |
이전 메모이제이션 기법과 비동기 처리를 하여 로딩 지연을 방지하도록 수정하였습니다,
이로써 지연에 대한 고민도 해결하고 부드러운 UI를 유지할 수 있습니다.
'프로그래밍 > iOS' 카테고리의 다른 글
Swift 4 TextView PlaceHolder (0) | 2019.02.21 |
---|---|
Swift 4 WKWebView 로딩(Indicator) (0) | 2019.02.20 |
Swift 4 WKWebView (0) | 2019.02.20 |
Swift 4 TableView 이미지 메모이제이션 기법 (0) | 2019.02.20 |
Swift 4 TableView 동적 높이 설정 (0) | 2019.02.19 |