[WWDC] Demystify SwiftUI — Dependency

WWDC2021 Demystify SwiftUI 중 Dependency 정리글

naljin
7 min readAug 2, 2021

SwiftUI 는 우리의 코드에서 아래의 세가지 요소를 확인합니다

  1. Identity — SwiftUI가 element동일한 것으로, 혹은 다른 것으로 인식하는 방법
  2. Lifetime — SwiftUI가 뷰와 데이터의 존재(existence)를 시간에 따라 추적하는 방법
  3. Dependency — SwiftUI가 인터페이스업데이트해야 하는 시기와 그 이유를 이해하는 방법

이 세 가지 개념을 통해 SwiftUI는 변경해야 할 사항(what), 변경 방법(how), 변경 시기(when)를 결정할 수 있습니다.

이전 두편에 걸쳐 identity가 무엇이고, identity가 어떻게 view의 lifetime 과 연관되어 있는지 살펴봤습니다.

오늘은 SwiftUI가 어떻게 UI를 업데이트하는지 살펴보겠습니다.

Dependency

dependency는 단순히 view에 대한 input 입니다. dependency가 변경되면 view는 새로운 body를 만들어야합니다.

참고로 bodyview에 대한 hierarchy를 빌드하는 곳이고, action은 view의 dependency에 대한 변경을 트리거하는 것입니다.

dependency graph

좌측의 코드를, 우측과 같이 도식화할 수 있습니다.

body가 초록색의 hierarchy로 표현되어 있고, 가장 상위 뷰에 대한 dependency가 파란색의 dog와 treat 로 표현됩니다.

이때 각 view는 각자의 dependency 목록을 가질 수 있습니다. 이렇게 말이죠.

한번 더 들어가서 생각해야 할 것은 동일한 state 나 data에 다수의 뷰가 의존할 수 있다는 점입니다.

선을 겹치지 않게 정리해 보면 마치 view와 dependency의 관계가 마치 그래프처럼 보입니다. 따라서 이러한 구조를 Dependency graph 라고 합니다.

SwiftUI는 해당 그래프를 통해 새로운 body 가 필요한 view가 무엇인지 파악 후 효율적으로 업데이트 할 수 있습니다.

dependency의 종류는 @Binding, @Environment, @State, @StateObject, @ObservedObject, @Environment 등 다양합니다.

Explicit Identity

identity는 dependency graph의 핵심입니다. identity를 통해 SwiftUI가 변경 사항을 올바른 view로 라우팅하고 UI를 효율적으로 업데이트 할 수 있습니다.

명시적으로 Identity를 설정할때 고려해야할 것은 식별자의 stabilityuniquness 입니다.

Identifier stability

좋은 식별자의 한가지 특성은 안정성입니다.

identifier가 안정적이면, view에 대한 storage를 지속적으로 생성하거나 dependency graph 를 업데이트하지 않아도 되기 때문에 퍼포먼스 측면에서 도움이 됩니다. 또한, SwiftUI는 lifetime을 이용해서 persisted storage를 관리하기 때문에, 안정적인 identifier은 state 손실을 방지하는 데도 중요합니다. (view의 lifetime identity의 지속시간(duration)이기 때문)

아래의 코드처럼 UUIDindicies 로 identifier을 설정하는 것은 stable 하지 않습니다. 전자는 데이터가 변경될때마다, 후자는 데이터의 위치에 따라 id 가 변경되기 때문입니다.

따라서 dataBaseID 같은 영구적인 identifier를 쓰는 것이 좋습니다.

Identifier uniquness

좋은 식별자의 또 다른 특성은 고유성입니다. 각 identifier가 단일 뷰에 매핑되어야 합니다.

아래처럼 name 과 같은 속성은 unique 하지 않을 수 있기 때문에 identifier 로 부적절합니다.

대신 serialNumber 같은 시리얼 넘버 같은건 unique 한 값을 사용하는 것이 더 나은 애니메이션과 퍼포먼스를 보장합니다.

Structured Identity

Explicit identity 에서는 식별자의 stability와 uniquness 를 고려한 것처럼, Structural identity 에서는 어떤 사항을 고려해야할까요?

아래의 코드는 브랜치로 view 가 분기되어 있습니다. 따라서 각 view 는 identifier가 다른 완전히 다른 뷰로 취급됩니다.

하지만 single identity의 동일한 view 를 사용하고 싶다면요?

이렇게 branch를 제거하고 opacity modifier 내에서 컨디션에 따라 값을 변경해줍니다.

브랜치를 불필요하게 사용할 경우 성능이 저하, 의도치 않은 애니메이션, state 손실 등이 발생할 수 있습니다. 따라서 브랜치를 도입 시에는 잠시 멈춘 후, 여러 뷰를 나타내는지 아니면 동일한 뷰의 다른 상태를 나타내는지 고려하는 것이 좋습니다.

마무리

  • identity 를 잘 설정하는 것이 좋은 성능을 위한 비결 중 하나입니다
  • identity를 통해 뷰의 수명(lifetime)을 도출할 수 있으며, 뷰의 수명과 관련된 스토리지, 전환 등을 제어할 수 있습니다.
  • SwiftUI는 identity와 lifetime을 사용하여 dependency를 만듭니다.
  • dependeny 는 UI를 효율적으로 업데이트할 수 있는 그래프로 표시됩니다.

오.. 대충 정리만 해놓고 귀찮아서 미루고 미루다가 어찌저찌 마무리 했네여 ㅎㅎ 해내버렸다! ㅋㅎ

이전 글

출처

--

--

No responses yet