자식 뷰의 레이아웃을 조절하고 업데이트할때 변환하는 layoutSubviews를 공부하며 직접 layoutSubviews를 직접 호출을 하면안되고 애플이 만들어놓은 별도 setNeedsLayout() 함수를 통해야한다고 한다
그 이유는 바로 run loop인데 그럼 그 Runloop는 뭘까
run loop란?
앱이 실행시 우리눈에는 보이지 않지만 Runloop라는 것이 같이 앱을 계속 loop하는 매커니즘이다
개념
- 이벤트 루프의 하나로 이벤트가 생겼는지 확인하고 그 이벤트를 처리한다
- os의 thread는 하나씩 runloop를 가지게 된다
- main thread에서 runloop가 제공되어 ui관리와 이벤트입력부터 출력까지 담당해준다
- 비동기 작업을 처리한다
- cpu작업을 효율적으로 관리한다 등
동작 원리
- 대기 waiting : 사용자 이벤트나 네트워크 응답을 대기한다
- 처리 processing : 수신한 이벤트에 대한 처리를 실행한다
- 대기 상태로 전환 running : 처리 이후 다시 대기로 전환한다
- 종료 exit : 종료 요청을 확인하면 루프를 종료한다
구조
- CFRunLoopSource
- 사용자의 입력과같은 동기 이벤트를 처리한다
타이머 소스 timer sources
- NSTimer, CADisplayLink
- 비동기 이벤트를 처리한다
Observer
- CFRunLoopObserver
- 런루프의 상태를 감지해서 이벤트를 처리한다
활용 예시
- 타이머 이벤트 유지 : 다른 이벤트가 발생해도 타이머는 유지됨
- 네트워크 요청 처리 : 비동기 이벤트 큐를 관리
- 백그라운드 작업 처리 : 별도의 스레드에 런 루프 추가하여 작업 실행
- UI 애니메이션 제어
- 백그라운드 작업 등