본문 바로가기

All Categories/iOS & Swift

[부스트코스 PJT5] Dispatch Queue 사용하기

반응형

#부스트코스 #iOS프로그래밍

부스트코스 프로젝트 마지막! BoxOffice는 서버의 API를 통해 영화 정보를 요청하고 가져옵니다.

그 중 첫번째 탭의 Table의 영화 리스트를 가져오는 화면을 구현하고 있었습니당!

통신이 잘 되는 것을 분명 확인했는데..

왜 안 나와..

 

처음에는 빈화면으로 떴다가 몇 초 기다려보니..!!

휴우.. 얼른 나와랏

이제야 제대로 뜨네요..!!!!

그 이유는 바로

tableview reloadData

tableView의 reloadData를 백그라운드 스레드에서 호출을 해줬기 때문입니다.

옆에 보라색 안내 메세지가

"UITableView.reloadData()는 메인 스레드에서만 사용해야 한다." 

고 친절하게 알려주고 있네요!

또 많은 양의 데이터를 한번에 받아오게 되면 이미지를 불러오는 데에 시간이 오래 소요될 수 있습니다.

 

1. 메인 스레드에서 테이블뷰 리로드 호출하기

MovieListService.shaed.getMovieList(orderType: orderType, completionHandler: { movieList in
    self.movieList = movieList
    // main thread
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
})

위와 같이 적어주면 뒤늦게 리로드되는 문제를 해결할 수 있습니다!

 

2. 이미지를 세팅하는 작업은 메인에서

이미지를 다운로드 받는 건 백그라운드에서 진행하고

이미지를 세팅하는 작업은 메인 스레드에서 처리해줍니다!

// thumbnail image
// imageview image 비워놓기
// cell.thumbImageView.image = nil
// background thread - download image
 DispatchQueue.global().async {
    guard let imageURL: URL = URL(string: movies?[indexPath.row].thumb ?? "") else { return }
    guard let imageData: Data = try? Data(contentsOf: imageURL) else { return }
    // main thread - setting image
    DispatchQueue.main.async {
        if let index: IndexPath = tableView.indexPath(for: cell) {
            if index.row == indexPath.row {
                cell.thumbImageView.image = UIImage(data: imageData)
            }
        }
    }
}

 

감사합니다. :)

반응형