-
collectionView, tableView reloadData 완료 시점iOS 2020. 4. 22. 18:01728x90
collectionView, tableView 를 새로 그려야 할 경우 가장 먼저 떠오르는 방법은 reloadData() 가 아닐까 싶습니다.
하지만 reloadData()가 끝난 이후에 해줘야 하는 작업들이 있을 수도 있겠죠. 제 경우엔 reloadData()가 끝난 이후에 셀들에다 animation 처리를 해줘야 하는 경우였는데요, 단순히 realodData() 이후에 animation 작업을 해주면 바로 completed 되어버리는 현상을 겪었습니다.
cell이 아직 완전히 reload 되기 전에 작업을 해줘서 발생한 문제라고 추측하고 reload가 끝난 시점에 처리해주기로 하였습니다.먼저 reloadData() 가 발생하면 어떤 일들이 일어나는지 먼저 살펴봐야겠죠?
reloadData()가 발생하면
~ numberOfItemsInSection 메서드에서 cell의 개수를 결정하고
~ cellForItemAt 메서드에서 cell을 화면에 보여질만큼의 셀을 생성합니다.
그리고 collectionView의 layoutSubViews가 호출됩니다.따라서 layoutSubViews가 호출된 시점은 cell들이 모두 reload되고 난 이후로 볼 수 있습니다.
따라서 reloadData() 이후의 시점에 어떤 처리를 해주고 싶다면 collectionView의 layoutSubViews 에서 처리해주면 됩니다.
그렇다면 어떻게 처리할 수 있을까요?
Custom collectionView를 만들고 completion Block을 만들어 layoutSubViews에서 처리해줍니다.
코드를 보시면 이해가 빠르실거에요 :)
import UIKit class MyCollectionView: UICollectionView { private var reloadDataCompletionBlock: (() -> Void)? func reloadDataWithCompletion(_ complete: @escaping () -> Void) { reloadDataCompletionBlock = complete super.reloadData() } override func layoutSubviews() { super.layoutSubviews() if let block = reloadDataCompletionBlock { block() } } }
사용하실 때는
myCollectionView.reloadDataWithCompletion { // reload 이후 처리 }
조금이라도 도움이 되셨으면 좋겠네요!!
감사합니다 :)
참고: https://medium.com/@jongwonwoo/uicollectionview-reloaddata-가-완료된-시점을-알아내는-안전한-방법-fa9bac8d0a89
'iOS' 카테고리의 다른 글
cellForItemAt: 에서 select 해주기 (3) 2020.04.24 ImageView scaleAspectFit 하고 정렬해주기 (3) 2020.04.23 AppDelegate ? (0) 2020.04.22 Swipe Gesture 와 Pan Gesture 함께 쓰기, Gesture Recognizer simultaneously (0) 2020.04.10 info.plist 파일 옮기기 (0) 2020.04.04