맛동산이

Swift) Draw Cycle에 대한 이해 본문

앱/Swift

Swift) Draw Cycle에 대한 이해

진ddang 2024. 3. 2. 17:05

: 오토레이아웃을 통한 애니메이션을 주는 방법(constraint를 이용한)에서 layoutifneeded()가 무엇을 뜻하는지 찾다가 공부하게 되었다.

Draw cycle이란, ios어플리케이션에서 view가 업데이트 되는, 과정을 의미한다.

이러한 draw cycle을 이해하기 위해서는 우선적으로, ios의 main run loop에 대한 이해를 필요로 한다.

Main run loop

이전에도 잠깐 언급되었지만, uiapplication은 ios os 시스템에서 event 큐를 통해서 이벤트를 입력받고 그것을 처리하는 런루프에 의해서 해당 uiapplication객체를 생성, 그 안에서 다양한 이벤트를 처리하여, 해당객체를 리턴해주는 방식으로 작동한다.

그렇다면 런루프란 정확히 무엇을 뜻하는것일까????

  • 런루프는 thread에 있는, 이벤트 처리 루프이다.
  • 모든 스레드마다 하나씩 있다.
  • 자동으로 run 하지않는다. (main에서는 자동으로 작동하게 된다.)

간단히 설명하자면, 무한적으로 계속해서 돌아가는, 이벤트 큐를 의미한다.

우리가 어떠한 io input이나, ui 변경이 필요와 같은 이벤트는 이벤트 큐를 통해서 작업이 입력되게 되는데, 그러한 입력들을 루프를 계속 돌면서 체크하게 되는것이다. 그래서 한번 루프를 돌면서 그 안에 있던 작업을 하나씩 처리하게 되고, 다시 루프를 돌면서 큐가 비었다면, 그대로 계속해서 돌고, 이벤트가 생겼다면 처리하게 되는, 이벤트 핸들링의 의미를 가지고있다.

왜? 런루프를 알아야하는가???, 바로 런루프의 마지막 사이클에서 (맨 마지막작업으로) Update Cycle 이라는것이 발생하게 되는데, 이때 layout, display, constraint를 업데이트 해주기 때문이다.

Update Cycle

Untitled.png

이러한 update 메소드는, viewDidLoad()함수에서도 동일하게 작동하게 된다. (최초 렌더링의 시점에서 )

하지만 위의 저러한 메소드는, update cycle에서 작동되는것이 바람직하기 때문에 애플에서 사용하지 말라고 도큐먼트에 작성되어 있다. (에러가 발생할 확률이 있는듯) 따라서 저러한 함수를 제외하고, 명시적으로 업데이트를 예약하는 메소드를 제공하고 있다.

setNeedsUpdateConstraints, setNeedsLayout, setNeedsDisplay

위의 3개의 메소드는 명시적으로 업데이트 요청을 하기 위한 메소드이다. 해당 메소드를 사용하면, 이번 main run loop 가 끝난 이후 다음 run loop 에서 업데이트 요청을 큐에 넣어뒀기 때문에, display, layout, constraint를 업데이트하게 된다.

하지만 자동적으로 ui변경이나, constraint변경을 하게 되면 불려져 오는 메소드 이기 때문에 딱히 필요한 메소드는 아니다 ㅋㅋㅋㅋ

그래서 그냥 setImage이런거 하면 이미지 변화하는거엿음…..

updateConstraintsIfNeeded, layoutIfNeeded

이 메소드가 사실 내가 궁금했던 메소드였지만,

이 메소드는 위의 메소드들과 다르게 update cycle을 기다리지 않고, 바로 display, layout, constraint를 변경하기 때문에 순차적으로 천천히 다음 update cycle을 기다리지 않고 변경되기 때문에, 애니메이션처럼 보이는것이다.

반응형