본문 바로가기

Swift/UIKit

스크롤 중 타이머로 인한 뷰 업데이트가 멈추는 현상

타이머를 통해 1초마다 label을 업데이트 하는 기능을 구현했다

해당 label은 CollectionView의 Cell 안에(정확히는 Section header) 배치된 label이었는데...

스크롤 도중 뷰 업데이트가 멈추고 스크롤에서 손을 떼면 지난 시간 만큼 한 번에 업데이트가 되어버리는 현상이었다

 

이 문제를 구글링 해보니

'스크롤을 하는 동작이 메인스레드를 막아 다른 뷰 업데이트가 되지 않는것이 정상적' 이란다...

그런데 왜 다른 어플들은 되는데??

 

그래서 더 찾아봤더니...

main runloop에 추가 하면 된단다

 

사실 뷰 업데이트를 위해 메인스레드에서 실행 시켜본 적은 있었으나 런루프에 추가시킨다는 생각은 해본적이 없던 멍충한 나...

 

그래서 런루프가 뭐지...?

그건 이 소들 선생님 블로그 보면 아주 자세히 잘 나와있다

 

iOS) 런 루프(RunLoop) 이해하기

안녕하세요 :) 소들입니다 오늘은 RunLoop라는 것에대해 공부를 해볼 건데여 음... 내용이 좀 어려울 수도 있어여!! 저도 오랜만에 다뤄서 완전히 이해하고 쓰는 내용이 아니라... (한 1년 전에 공부

babbab2.tistory.com

 

대충 나의 경우는 타이머를 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) NSTimer Stop when Scrolling

Help me. I tried to make NSTimer with UIScrollView. but NSTimer stop during Scrolling on UIScroll View.. How can I keep work NSTimer during scrolling?

stackoverflow.com