[WWDC] Demystify SwiftUI — Lifetime
SwiftUI 는 우리의 코드에서 아래의 세가지 요소를 확인합니다
- Identity — SwiftUI가 element를 동일한 것으로, 혹은 다른 것으로 인식하는 방법
- Lifetime — SwiftUI가 뷰와 데이터의 존재(existence)를 시간에 따라 추적하는 방법
- Dependency — SwiftUI가 인터페이스를 업데이트해야 하는 시기와 그 이유를 이해하는 방법
이 세 가지 개념을 통해 SwiftUI는 변경해야 할 사항(what), 변경 방법(how), 변경 시기(when)를 결정할 수 있습니다.
오늘은 이전 시간에 살펴본 view의 identity가 어떤식으로 view와 data (state) 의 수명에 관련되어있는지 살펴보겠습니다.
View value != View identity
만약 ‘테세우스’ (identity) 라는 고양이가 있다고 해봅시다. 시간에 따라 테세우스의 기분 상태 (state) 는 변할 수 있겠지만, 어쨌든 항상 ‘테세우스’라는 같은 고양이인 것에는 변함이 없습니다.
view의 identity와 lifetime 도 동일한 방식으로 생각할 수 있습니다. 즉, 테세우스(고양이)가 시간에 따라 다른 기분일 수 있듯이, 우리의 view도 lifetime 동안 다른 state 값을 가질 수 있습니다. 하지만 기분에 따라 테세우스의 본질이 변하지 않았듯이, view도 동일한 identity를 갖는 이상 view value에 상관없이 동일한 view 로 인식됩니다.
A view’s lifetime is the duration of the identity
view가 처음 생성(created)되고 나타날(appear) 때, SwiftUI는 이전 시간에 설명한 기술 (Explicit or Structural) 들을 통해 view에 identity 를 할당합니다.
시간이 지나면서 view 에 새로운 값(value)들이 생성될 수 있지만 (state 값이 변경되는 것), SwiftUI 관점에서는 여전히 동일한 view 입니다(같은 identity를 가지기 때문).
view의 수명이 종료될 때는 identity가 변경되거나, view가 제거(removed)될 때입니다. 따라서 view 의 수명은 identity의 지속 시간과 연관됩니다.
State lifetime = View lifetime
view identity 와 view lifetime 을 연결지어 생각할 수 있어야 비로소 SwiftUI가 어떻게 상태(state)를 유지하는지를 이해할 수 있습니다.
SwiftUI는 view에서 State
나 StateObject
를 확인하면, 해당 데이터를 뷰의 lifetime 동안 유지해야 한다는 것을 인식합니다. 즉, State
와 StateObjec
t는 view의 identiy와 연결된 영구적인 저장소(persistent storage)입니다.
view가 처음으로 만들어질때, SwiftUI는 State
및 StateObject
의 초기 값을 사용하여 메모리에 스토리지를 할당합니다.
아래 그림에서는 title
State에 초점을 맞추고 있습니다. SwiftUI는 storage가 변경(mutated)되어 view의 body가 재계산 (re-evaluated) 될 때에도, 뷰의 lifetime에 걸쳐 계속 해당 storage를 유지(persist) 합니다.
하지만 만약 identity 가 변경되는 방식으로 새로운 뷰가 생성된다면, 기존 view에 대한 storage는 deallocated 되고, state의 초기 값에서 다시 새로운 storage를 만듭니다.
identity 가 변경될 때마다 state 도 교체(replaced)되고, identity는 view의 lifetime과 연관되기 때문에, state의 영속성(persistence)은 view의 lifetime과 관련이 있다고 할 수 있습니다 (삼단논법 🧔🏼?!).
따라서 적절한 identity 값 (identifier) 을 사용해야, view와 data의 수명(lifetime)을 올바르게 제어할 수 있습니다.
마무리
- View value 들은 일시적이므로 그것의 수명에 의존해서는 안 됩니다. (state는 자주 mutate 될 수 있음)
- 하지만 View identity는 일시적이지 않기 때문에 시간이 지나도 view의 연속성을 제공할 수 있습니다.
- 우리는 view의 identity를 컨트롤 할 수 있고, 이를 사용하여 view의 수명을 명확히 할 수 있습니다.
- SwiftUI는 데이터 기반 component에 대한
Identifiable
프로토콜을 최대한 활용하므로, 데이터에 대한 안정적인 identifier를 선택하는 것이 중요합니다.
이렇게 SwiftUI가 확인하는 세가지 요소 (Identity, Lifetime, Dependency) 중 두번째 Lifetime 에 대해 살펴보았습니다.
나머지 하나는.. 과연.. 쓰게 될까요..? 쓰게 된다면 밑에 링크를 추가하겠습니다.