[WWDC2019] Data Flow in SwiftUI

Valse·2022년 12월 7일
0

WWDCMemos

목록 보기
1/2

Data

  • 어떤 데이터 프로퍼티 래퍼를 써야 적당한 데이터 접근이 가능한가?
    데이터가 변할 때마다 뷰를 바꿔야 한다.
    이러한 데이터 의존성은 꽤 복잡하지만, SwiftUI의 API가 많은 도움을 준다.
    뷰의 계층에서 각 데이터는 지속가능한 모델에서 Single Source of Truth 를 갖는다.
    이 모델이 복제되면 하나의 모델 내부의 데이터가 원치않는 변화를 겪을 수 있기 때문에 하나의 모델을 갖고 그 모델에서 데이터를 보관하는 것은 중요하다.

  • 모든 @State는 Source of Truth가 된다.
    뷰는 이 State의 작용으로서 계속해서 새롭게 그려진다.

  • @Binding은 데이터를 갖지 않고, 읽고 변형하는 역할을 할 때 적절한 도구가 된다.
    이 경우, State의 참조를 갖게 되며(get reference), 그 복사된 값을 갖지 않는다.

  • 바인딩 값의 변화에 따라 애니메이션을 넣어서 뷰를 새로 그리게 하고 싶다면, 그 바인딩 값을 변화시키는 로직을 witnAnimation{} 로 감싸면 된다.

  • .onReceive() : 데이터 의존을 개발자가 직접 이어주기 위해 사용할 수 있는 메소드.


BindinableObject

  • 참조 타입 모델로서 내가 직접 관리하는 모델이다(뷰가 갖는 데이터가 아닌).
class SomeClass: BindableObject {
	var didChange = PassthroughSubject<Void, Never>()

    func doSth() {
        ...
        didChange.send()
    }
}
  • 이 경우, 데이터 의존성을 만들고 싶다면? @ObjectBinding을 활용할 수 있다.
  • 함수 호출의 위치에 따라 데이터의 업데이트 시점도 정해줄 수 있는 것으로 보인다.

Indirectly Dependency

  • 간접적으로 데이터 의존성을 뷰에 전달할 때는 @EnvironmentObject가 좋은 도구가 된다.
  • 이 환경객체가 연결된 모든 뷰는, 환경객체의 요소가 변할때 함께 변한다.
  • 환경객체를 통해 원하는 뷰에 원하는 데이터만 전달할 수 있다.
  • 데이터와 다이나믹 타입, 다크모드, 등등 정말 많은 API가 프레임워크에 속해있다.

Sources of Truth

  • @State : 뷰 스코프에서 작동하며 프레임워크에 의해 관리된다. 값타입이다.
  • @BindableObject : 개발자가 직접 관리해야 하며, 참조 타입이다.

정리

First Class reference to Data, Great for resuability

  • 바인딩으로 전달되는 모든 데이터는 위치가 중요하지 않고, 어떻게 변경할 것인지에 대한 로직만을 고민하면 된다.
  • Source of Truth는 최소하는 것이 좋다. 데이터의 효율적인 관리를 가능하게 하며, 이는 곧 뷰의 재활용성을 향상하는 데에 도움이 되고, 그만큼 버그를 잡기에 좋다.
profile
🦶🏻🦉(발새 아님)

0개의 댓글