Swift) Draw Cycle에 대한 이해

2024. 3. 2. 17:05·앱/Swift

: 오토레이아웃을 통한 애니메이션을 주는 방법(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을 기다리지 않고 변경되기 때문에, 애니메이션처럼 보이는것이다.

반응형

'앱 > Swift' 카테고리의 다른 글

Swift) MKWebView를 통한 javascript 통신  (0) 2024.05.13
Swift) Notification Center 이란, 쓰는법  (0) 2024.03.02
Buttom sheet( panmodal)  (0) 2024.03.02
Swift) CollectionView CompositionalLayout-2  (0) 2024.03.02
Swift) 컬렉션뷰 (CollectionView) 레이아웃 -1  (0) 2024.03.02
'앱/Swift' 카테고리의 다른 글
  • Swift) MKWebView를 통한 javascript 통신
  • Swift) Notification Center 이란, 쓰는법
  • Buttom sheet( panmodal)
  • Swift) CollectionView CompositionalLayout-2
진ddang
진ddang
안녕하세요 진땅의 개발자 블로그 입니다. 피드백은 환영입니다. 깃헙 : https://github.com/it794613
    반응형
  • 진ddang
    맛동산이
    진ddang
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 일기 그리고 목표 (1)
      • 웹 (20)
        • 리액트 (19)
      • 앱 (115)
        • Swift 문법 (15)
        • Swift (65)
        • SwiftUI (32)
        • 리액트 네이티브 (3)
      • CS (30)
        • 컴퓨터그래픽스 (8)
        • 운영체제 (6)
        • 네트워크 (16)
      • 알고리즘 (13)
        • 백준 (12)
        • 프로그래머스 (1)
      • 대외활동 (7)
        • ict한이음(2022.04) (2)
        • 멋쟁이 사자처럼 (5)
        • Apple Developer Academy (0)
      • 다양한 내용들 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    운영체제
    리액트
    대외활동
    composable architecture
    멋사
    spritekit
    문법
    영남대
    스위프트
    swift concurrency
    dispatchqueue
    스유
    웹
    ReactorKit
    widgetkit
    네트워크
    uikit
    알고리즘
    c++
    백준
    컴퓨터그래픽스
    위젯킷
    SwiftUI
    widget
    TCA
    멋쟁이사자처럼
    Protocol
    후기
    Swift
    cs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
진ddang
Swift) Draw Cycle에 대한 이해
상단으로

티스토리툴바