program tip

UIScrollView는 스크롤이 끝날 때까지 NSTimer를 일시 중지합니다.

radiobox 2020. 9. 23. 07:29
반응형

UIScrollView는 스크롤이 끝날 때까지 NSTimer를 일시 중지합니다.


UIScrollView(또는 그 파생 클래스)가 스크롤하는 동안 NSTimers실행중인 모든 항목 이 스크롤이 완료 될 때까지 일시 중지되는 것처럼 보입니다 .

이 문제를 해결할 방법이 있습니까? 스레드? 우선 순위 설정? 아무것도?


쉽고 간단한 구현 솔루션은 다음과 같습니다.

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
                                         target:...
                                       selector:....
                                       userInfo:...
                                        repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Swift 3를 사용하는 모든 사람

timer = Timer.scheduledTimer(timeInterval: 0.1,
                            target: self,
                            selector: aSelector,
                            userInfo: nil,
                            repeats: true)


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

예, 폴이 맞습니다. 이것은 런 루프 문제입니다. 특히 NSRunLoop 메서드를 사용해야합니다.

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode

이것은 빠른 버전입니다.

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)

스크롤하는 동안 타이머를 실행하려면 다른 스레드와 다른 실행 루프를 실행해야합니다. 타이머는 이벤트 루프의 일부로 처리되기 때문에 뷰 스크롤을 처리 하느라 바쁘면 타이머에 접근 할 수 없습니다. 다른 스레드에서 타이머를 실행하는 성능 / 배터리 패널티는이 경우를 처리 할 가치가 없을 수도 있습니다.


누구나 Swift 4를 사용합니다.

    timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
    RunLoop.main.add(timer, forMode: .common)

참고 URL : https://stackoverflow.com/questions/605027/uiscrollview-pauses-nstimer-until-scrolling-finishes

반응형