Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@ObservedObject 본문

SwiftUI

@ObservedObject

JangJupyo 2024. 9. 21. 17:15
728x90
반응형

@ObservedObject외부에서 전달된 객체를 감시하고, 해당 객체의 상태가 변경될 때 자동으로 UI를 업데이트하는 데 사용되는 SwiftUI의 중요한 프로퍼티 래퍼입니다. ObservableObject와 함께 사용되며, 클래스 기반 상태를 감시할 때 필수적인 역할을 합니다.

 

ObservedObject란?

  • ObservedObject는 SwiftUI에서 외부에서 전달받은 ObservableObject를 감시하는 프로퍼티 래퍼입니다.
  • 뷰가 외부 객체의 상태를 감시하고, 객체의 데이터가 변경될 때 자동으로 UI가 업데이트됩니다.
  • 뷰가 객체를 생성하지 않고, 외부에서 전달받아 감시하는 상황에서 사용됩니다.

 

사용 이유

  • 외부 객체의 상태를 감시하고, 해당 상태가 변할 때 자동으로 UI를 갱신하기 위해 사용합니다.
  • 객체의 상태가 다른 뷰에서도 공유되거나 다른 곳에서 생성된 데이터가 변경될 때 반영됩니다.

 

사용 예시

class CounterViewModel: ObservableObject {
    @Published var count: Int = 0
    
    func increment() {
        count += 1
    }
}

struct ContentView: View {
    @ObservedObject var viewModel: CounterViewModel
    
    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
                .padding()
            
            Button("Increment") {
                viewModel.increment()
            }
        }
    }
}
  • CounterViewModel: @Published 프로퍼티로 count를 선언하고, 값이 변경될 때 자동으로 감지됩니다.
  • ContentView: @ObservedObject로 외부에서 전달된 viewModel의 상태를 감시합니다. 버튼을 누르면 count가 증가하고 UI가 업데이트됩니다.

 

@StateObject와의 차이

  • @ObservedObject는 외부에서 전달된 객체를 감시할 때 사용합니다.
  • @StateObject는 뷰가 직접 객체를 생성하고, 그 객체의 상태를 관리할 때 사용합니다.
프로퍼티 래퍼 역할 객체 생성 및 소유
@StateObject 뷰에서 직접 객체를 생성하고 관리 뷰가 객체를 소유
@ObservedObject 외부에서 전달된 객체를 감시 객체는 외부에서 관리

 

데이터 흐름 관리

  • @ObservedObject를 사용하면 데이터가 여러 뷰에서 공유되거나 외부에서 변경된 데이터가 뷰에 반영됩니다.
  • 여러 뷰에서 같은 객체를 사용하여 동일한 상태를 감시하고 일관성 있는 데이터 흐름을 유지할 수 있습니다.

 

메모리 관리

  • @ObservedObject는 객체를 직접 소유하지 않고 외부에서 전달된 객체를 감시합니다.
  • 객체의 수명 주기는 외부에서 관리되며, 뷰가 해제되더라도 객체는 남아 있을 수 있습니다.
  • 메모리 관리가 더 유연하게 이루어집니다.

 

ObservableObject와의 관계

@ObservedObject는 ObservableObject와 함께 사용됩니다. ObservableObject는 데이터의 상태 변화를 감지하는 프로토콜로, 해당 데이터를 감시하는 뷰는 @ObservedObject를 통해 자동으로 상태 변화를 감지하고 UI를 업데이트합니다.

 

다른 뷰에서 상태 공유하기

@ObservedObject를 사용하면 한 객체를 여러 뷰에서 공유할 수 있습니다. 예를 들어, 아래 코드는 두 개의 뷰에서 같은 ViewModel을 감시하는 예시입니다.

struct ParentView: View {
    @StateObject var viewModel = CounterViewModel()
    
    var body: some View {
        VStack {
            ContentView(viewModel: viewModel)
            AnotherView(viewModel: viewModel)
        }
    }
}

struct AnotherView: View {
    @ObservedObject var viewModel: CounterViewModel
    
    var body: some View {
        Text("Another count: \(viewModel.count)")
    }
}
  • ParentView에서 @StateObject로 viewModel을 생성합니다.
  • ContentView와 AnotherView는 @ObservedObject로 이 객체를 감시하며, 동일한 데이터를 표시하고 업데이트합니다.

 

결론

  • @ObservedObject는 외부에서 전달된 객체의 상태를 감시하고 자동으로 UI를 업데이트하는 데 사용됩니다.
  • 외부 객체의 상태가 여러 뷰에서 공유될 때 사용되며, 데이터 변경이 자동으로 반영됩니다.
  • @StateObject와는 달리 객체의 소유권을 갖지 않으며, 외부에서 전달된 데이터를 감시하는 역할을 합니다.

 

요약

  • @ObservedObject는 외부에서 전달된 객체를 감시합니다.
  • 객체의 상태가 변경될 때 UI가 자동으로 업데이트됩니다.
  • ObservableObject와 함께 사용하여, 상태 변화를 감시하고 자동으로 UI를 갱신할 수 있습니다.
  • @StateObject와 다르게 객체를 소유하지 않으며 외부에서 관리되는 객체를 감시합니다.
반응형

'SwiftUI' 카테고리의 다른 글

@Environment  (0) 2024.09.27
@Published  (0) 2024.09.22
@Binding  (2) 2024.09.16
@StateObject  (0) 2020.10.15
ObservableObject  (0) 2020.10.15