RunLoop란?

RunLoop는 스레드와 관련된 기본 인프라의 일부입니다. RunLoop는 작업을 예약하고 들어오는 이벤트 수신을 조정하는 데 사용하는 이벤트 처리 루프입니다. RunLoop의 목적은 수행할 작업이 있을 때 스레드를 바쁘게 유지하고 작업이 없을 때 스레드를 절전 모드로 전환하는 것입니다.

런 루프 관리는 완전히 자동이 아닙니다. 적절한 시간에 RunLoop를 시작하고 들어오는 이벤트에 응답하도록 스레드의 코드를 설계해야 합니다. Cocoa와 Core Foundation 모두 스레드의 RunLoop를 구성하고 관리하는 데 도움이 되는 RunLoop 개체를 제공합니다. 애플리케이션은 이러한 객체를 명시적으로 생성할 필요가 없습니다. 애플리케이션의 메인 스레드를 포함한 각 스레드에는 연관된 RunLoop개체가 있습니다. 그러나 secondary 스레드에서 만큼은 RunLoop를 명시적으로 실행해야 합니다. 앱 프레임워크는 애플리케이션 시작 프로세스의 일부로 메인 스레드에서 RunLoop를 자동으로 설정하고 실행합니다.

다음 섹션에서는 런 루프에 대한 자세한 정보와 이를 애플리케이션에 맞게 구성하는 방법을 제공합니다. 런 루프 객체에 대한 추가 정보는 NSRunLoop 클래스 참조 및 CFRunLoop 참조를 참조하세요.

UIScrollView에서 스크롤할 때, Timer가 동작하지 않는 이슈

동작 상황 정리

  1. timer의 run loop를 변경 없이 실행하는 경우.

    1번 화면.mp4

  2. timer의 run loop를 tracking으로 변경해서 실행하는 경우.

    2번영상.mp4

해결 방법

RunLoop Mode는 뭐지?

RunLoop 모드는 모니터링할 입력 소스 및 타이머의 모음과 알림을 받을 RunLoop observer에 대한 타입입니다. RunLoop를 실행할 때마다 실행할 특정 “모드”를 명시적으로 또는 암시적으로 지정합니다. RunLoop가 통과하는 동안 해당 모드와 관련된 소스만 모니터링되고 이벤트 전달이 허용됩니다. (마찬가지로, 해당 모드와 연관된 관찰자에게만 RunLoop의 진행 상황이 통보됩니다.) 다른 모드와 연관된 소스는 이후에 적절한 모드의 루프를 통과할 때까지 새로운 이벤트를 유지합니다.

Untitled

왜 UIScrollView를 스크롤할 때 tracking모드로 변경되느냐? (원문 링크)

스크롤 뷰에는 스크롤 바가 없기 때문에 터치 신호가 스크롤하려는 의도인지, 컨텐츠의 서브뷰를 추적하려는 것인지를 알아야 합니다. 이것을 알아내기 위해서 스크롤 뷰는 타이머를 시작하면서 터치다운 이벤트를 일시적으로 차단하고 타이머가 끝나기 전까지 터치중인 손가락의 움직임을 관찰합니다. 큰 움직임이 없이 타이머가 끝나면 스크롤 뷰는 컨텐츠의 터치된 서브뷰에 추적 이벤트를 전달하고 타이머가 경과하기 전에 손가락이 충분한 드래그 움직임을 보인다면 서브뷰로 가는 모든 추적을 취소하고 스크롤링을 수행합니다. 서브클래스는 (스크롤 뷰에 의해 호출되는) touchesShouldBegin(_:with:in:), isPagingEnabled, touchesShouldCancle(in:) 메서드를 오버라이드 할 수 있으며 이 메서드들은 스크롤 뷰가 스크롤링 제스처를 컨트롤하는 방법에 영향을 미칩니다.