SwiftUI의 @ObservableObject와 @StateObject

June·2023년 2월 2일
1

SwiftUI-Data

목록 보기
3/12
post-thumbnail

@State와 클래스를 함께 사용하면, @State와 구조체를 함께 사용했을 때와는 다르게 데이터가 업데이트 되지 않는다.

  • 클래스(참조 타입)에는 @StateObject 사용
  • 값 타입에는 @State 사용

클래스와 바인딩하는 방법

class Book: ObservableObject {   // 1. 클래스가 ObservableObject를 준수하도록 설정
    var year = ""
    var price = ""
}

struct BindingWithClassData: View {
    @StateObject var book = Book()     // 2. @StateObjcet 변수에 할당 
}

/// ❗️이 상태에서는 데이터는 여전히 업데이트되지 않음!
  • @StateObject 는 ObservableObject를 준수하는 클래스 유지에 사용된다.
class Book: ObservableObject {   

    // 3. @Published로 변경할 속성 게시! 
    @Published var year = ""    
    @Published var price = ""
}

struct BindingWithClassData: View {
    @StateObject var book = Book()     
}
  • @Published를 사용하면, 데이터 변경 내용을 ObservableObject가 UI에 푸시할 수 있다.

@ObservableObject의 데이터 플로우

  1. UI가 Model을 새롭게 업데이트
  2. 뷰가 업데이트되는 동안, @StateObject가 book 유지시킴
  3. Model이 새 데이터 게시

데이터 변경 사항 관찰을 위한 3가지 요구사항

클래스 데이터의 변경사항이 UI에 자동으로 업데이트되도록(양방향 바인딩) 하기 위한 3단계
1. 클래스가 ObservableObject 준수하도록 한다. (UI가 이제부터 객체의 변경사항을 관찰할 수 있다는 의미)
2. @Published를 속성에 추가해, UI에 변경사항 알림. (@Published가 없으면 이 속성의 값이 변경될 때 UI에 알릴 수 없음)
3. @StateObject를 사용해 ObservableObject를 UI에 바인딩. (이 @StateObject는 UI와 ObservableObject간의 양방향 통신을 허용)
👉 이런 요구 사항을 반드시 순서대로 수행할 필요는 없지만, 데이터와 UI간의 양방향 바인딩을 위해 모든 요소는 존재해야 한다.

@ObservableObject 정리

ObservableObject 를 사용하는 경우

  • 클래스를 데이터 모델로 사용하려는 경우
  • UI와 바인딩하려는 속성이 class에 있는 경우

ObservablsObject 클래스를 UI에 바인딩하기

  • @StateObject 속성 래퍼를 사용해 ObservableObject 객체에 속성 할당

@StateObject 정리

StateObject 를 사용하는 경우

  • View에서 클래스 속성을 업데이트하려는 경우(변경 가능하게 만들기)
  • 인스턴스화하고 앱의 한 화면에 대해서만 유지하려는 클래스가 있는 경우
  • ObservableObject 클래스에서 데이터와의 양방향 바인딩이 필요한 경우
    👉 즉 스크린에 대해서만 인스턴스화하고 유지해야 하는 ObservableObject class가 있을 때, @StateObject를 사용한다.
    ❗️ 클래스(참조 타입)가 아닌 값 타입에는 @State 사용할 것


Combine Framework

@Published

  • @Published를 사용하면, 속성이 변경되면 해당 속성을 사용하는 모든 사람에게 값을 업데이트 하도록 알림.
  • @Published 속성 래퍼는 Combine 프레임워크의 일부.
  • Combine 프레임워크는 데이터 변경 사항을 듣고 실행할 수 있는 도구를 개발자에게 제공함.

선언적 Swift API

  • 선언적 API란, 하려는 행위를 "선언"하면 프레임워크가 알아낼 것을 의미.
  • 실행할 명령이나 단계의 순서를 명시적으로 나열할 필요 없음.

시간 경과에 따른 값 처리

보통 외부 소스에서 데이터를 얻는 경우가 많고, 얼마나 오래 걸릴지 모른다. 해당 외부 소스가 한 번에 데이터를 얼마나 보낼지조차 모를 수 있다.
하지만 @Published는 데이터가 수신되면 시간이 지남에 따라 알림을 계속 보낸다.

profile
안다고 착각하지 말기

0개의 댓글