setNeedsLayout

도윤·2022년 10월 16일
0

iOS

목록 보기
7/11

프로젝트를 하다가 view가 업데이트가 안돼서 강제로 setNeedsLayout을 호출했었던 적이 있다. 개념을 잘 몰라서 알아보겠슴다

https://developer.apple.com/documentation/uikit/uiview/1622601-setneedslayout

우선 공식 문서의 내용을 보자!

receiver의 현재 layout을 무효화하고 다음 업데이트 사이클 동안의 업데이트된 layout으로 업데이트 하는 것 같다...

뷰의 subview들의 레이아웃을 조정하고 싶을 때 메인 스레드에서 이 메서드(setNeedsLayout)를 호출하면 된다. 이 메서드는 요청을 메모(note)하고 즉각 반환한다. 즉시 layout을 업데이트하는 것이 아닌 것이 아니라 다음 업데이트 사이클까지 기다리고 views가 업데이트되기 전에 여러 뷰의 레이아웃을 무효화(invalidate)하기 위해 setNeedsLayout()을 사용할 수 있다. 이러한 방식은 layout update를 한 update cycle에서 한번에 처리하면서 성능을 향상시킬 수 있다.

업데이트 사이클과 같은 개념이 뭘까?

https://sueaty.tistory.com/m/162
https://developer.apple.com/documentation/foundation/runloop

다음 게시글을 참조하여 Update Cycle을 알아보겠습니다!

Main RunLoop

공식문서에는 다음과 같이 나와있습니다!

RunLoop 오브젝트는 window 시스템이나 Port 객체로 부터 발생하는 mouse, keyboard와 같은 input 처리를 다루고 또한 Timer이벤트도 다룬다.

실제 앱에서는 RunLoop 오브젝트를 만들수도 없고 다룰 수(manage)도 없다.
시스템은 메인 Thread를 포함하여 각 thread 객체를 위해 필요할때 RunLoop object를 만든다. 현재 스레드의 RunLoop에 접근해야한다면 current메서드를 사용하면 된다.

사용자가 input(이벤트)이 발생하면 해당 이벤트를 event queue에 추가되면 Main Run loop가 이벤트를 하나씩 가져와서 Application Object에 Dispatch해주는 방식으로 동작한다.

Core object들 중에서 수행할 수 있는 handler 호출하는데 이때 개발자의 코드가 실행된다. 실행된 코드가 return되면 다시 handler에서 main run loop으로 넘어간다. 이때 update cycle이 시작된다.

Update Cycle

Update Cycle은 event handling code를 모두 실행하고 Control을 다시 main run loop가 갖게 되면서 시작된다.
이때 layout, display, constraint들을 업데이트한다!

이벤트 처리 도중에 view에서 변화가 생기면 다음 사이클에 update flag를 켜서 변경사항을 바꿀 수 있습니다.

이렇게 도중에 발생한 변경사항들을 다음 Cycle에 업데이트할 경우에 사용성에 문제가 발생할 것 같지만 iOS application refresh Cycle은 일반적으로 1/60초가 걸리기 때문에 사용자가 체감할 수 없는 시간입니다.

update cycle: Layout -> Display -> Constraint

layout : View의 크기 + Screen에서의 View의 위치
Display: text, color, image 등 size,frame과 관련없는 속성들
Constraint: 오토 레이아웃에서 자주 보셨겠지만 View의 Layout을 정의하고 있는 규칙

이렇게 runloop와 Update cycle에 대해 간단하게 알아보았습니다!


setNeedsDisplay에 대해 알아보려다가 확인해야될게 더 많아져서 다음 포스팅에서 게시하도록 하겠슴다

0개의 댓글