THIS IS ELLIE

layoutIfNeeded, setNeedsLayout의 차이 본문

개발/iOS

layoutIfNeeded, setNeedsLayout의 차이

Ellie Kim 2020. 9. 4. 01:59

오늘은 레이아웃을 다루는 메서드에 대해서 (아래 링크 의역 및) 정리해보려 합니다.

layoutIfNeeded vs setNeedsLayout

 

먼저, iOS앱이 시작되면 시스템 객체는(UIApplication) 메인 스레드에서 메인 런 루프를 돌기 시작합니다.

메인 런 루프는 (예: 유저의 터치) 이벤트를 처리하고 뷰 기반 인터페이스에 대한 업데이트를 처리합니다. 

터치, 위치 업데이트, 모션 및 멀티 미디어 제어와 같은 이벤트가 발생하면,

메인 런 루프는 이벤트에 대한 적절한 트리거를 찾아서 적절한 메서드를 호출하는 등 작업을 수행합니다. 

이때 모든 이벤트가 처리되고 제어(control)가 메인 런 루프로 돌아가는 시점에 업데이트할 때가 업데이트 주기입니다.

여기서 나오는 업데이트 주기가 아래에서 말하는 업데이트 주기가 됩니다.

 

참고)

resource: programming guide iOS

 

setNeedsLayout

setNeedsLayout메서드는 업데이트 주기가 되면 해당 뷰와 모든 서브 뷰를 다시 그리고 레이아웃하도록 시스템에 알립니다.

이 메서드는 비동기적으로 동작합니다. 메서드가 즉시 완료되고 리턴되기 때문입니다. 

하지만 나중에 다시 그리고 레이아웃하기 때문에 업데이트 주기가 언제인지 알 수 없습니다.

 

애플 문서에 따르면 :

뷰와 서브 뷰 레이아웃을 조정하길 원한다면 애플리케이션의 메인 스레드에서 이 메서드를 호출하도록 합니다.  

이 메서드는 요청 기록하고 즉시 리턴합니다.

이 메서드는 강제로 즉시 업데이트하지 않으며, 다음 업데이트 주기를 기다리기 때문에

여러 뷰들이 업데이트 되기 전에 여러 뷰들의 레이아웃을 무효화하는데 사용할 수 있습니다.

이 메서드를 사용하면 모든 레이아웃 업데이트를 하나의 업데이트 주기로 통합할 수 있으며 일반적으로 성능이 더 좋습니다.

 

layoutIfNeeded

반대로 layoutIfNeeded메서드는 동기적으로 동작합니다.

이 메서드는 업데이트 주기를 기다리지 않고 즉시 해당 뷰와 모든 서브 뷰를 다시 그리고 레이아웃하도록 시스템에 요청합니다.

이 메서드에 대한 호출이 완료되면 메서드 호출 이전에 기록된 모든 변경 사항을 기반으로 이미 레이아웃이 조정되고 그려집니다.

보류 중인 레이아웃 업데이트가 없으면 종료합니다.

 

UIView의 setNeedsLayout()은 다음 업데이트 주기가 되면 현재 뷰 및 서브 뷰를 다시 그리도록 시스템에 지시합니다.

반면 layoutIfNeeded()는 다음 업데이트 주기를 기다리지 않고 즉시 다시 현재 뷰 및 서브 뷰를 다시 그리도록 시스템에 지시합니다.

 

setNeedsLayout layoutIfNeeded
비동기적 동기적 
업데이트 주기 즉시

 

resource:

https://developer.apple.com/documentation/uikit/uiview/1622507-layoutifneeded

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

https://medium.com/@abhimuralidharan/ios-swift-setneedslayout-vs-layoutifneeded-vs-layoutsubviews-5a2b486da31c

반응형