타이머를 통해 1초마다 label을 업데이트 하는 기능을 구현했다
해당 label은 CollectionView의 Cell 안에(정확히는 Section header) 배치된 label이었는데...
스크롤 도중 뷰 업데이트가 멈추고 스크롤에서 손을 떼면 지난 시간 만큼 한 번에 업데이트가 되어버리는 현상이었다
이 문제를 구글링 해보니
'스크롤을 하는 동작이 메인스레드를 막아 다른 뷰 업데이트가 되지 않는것이 정상적' 이란다...
그런데 왜 다른 어플들은 되는데??
그래서 더 찾아봤더니...
main runloop에 추가 하면 된단다
사실 뷰 업데이트를 위해 메인스레드에서 실행 시켜본 적은 있었으나 런루프에 추가시킨다는 생각은 해본적이 없던 멍충한 나...
그래서 런루프가 뭐지...?
그건 이 소들 선생님 블로그 보면 아주 자세히 잘 나와있다
대충 나의 경우는 타이머를 scheduledTimer로 선언해 메인스레드의 런루프로 추가가 되는 줄 알았는데
그냥 가장 최근에 생성된 런루프에 추가가 되고 그게 메인스레드 런루프랑은 별개인건가보다(뇌피셜)
private func startTimer(endDate: Date) {
self.timer?.invalidate()
self.timer = nil
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { [weak self] _ in
self?.updateRemainTime(endDate: endDate)
})
RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
self.timer = timer
}
암튼 코드는 너무나 간단했고 결과는
완벼크 ㅋ
참고
'Swift > UIKit' 카테고리의 다른 글
높이 조절 가능한 CustomModal(Half Modal) (1) | 2024.02.13 |
---|---|
Tableview pagination (0) | 2024.01.24 |
높이가 다른 이미지 다운로드 후 Cell에 할당 (0) | 2024.01.09 |
Compositional Layout으로 여러가지 모양(?) 적용기 (1) | 2023.12.27 |