본문 바로가기
코딩 공부/Swift

ObservableObject와 objectWillChange

by JH-M 2023. 3. 9.

ObservableObject 프로토콜은 SwiftUI에서 데이터 모델과 뷰 간의 데이터 흐름을 제어하기 위한 중요한 프로토콜입니다. ObservableObject을 구현하는 클래스나 구조체는 데이터가 변경될 때마다 뷰에 알리기 위해 objectWillChange 라는 특별한 publisher를 제공합니다.

objectWillChange publisher를 사용하면 SwiftUI는 변경이 감지될 때 뷰를 자동으로 업데이트할 수 있습니다. objectWillChange publisher는 SwiftUI 뷰에서 자동으로 구독되므로, ObservableObject을 구현하는 클래스나 구조체에서는 데이터가 변경될 때 objectWillChange publisher를 사용하여 뷰를 업데이트할 수 있습니다.

objectWillChange publisher는 send() 메서드를 호출하여 데이터가 변경되었음을 알립니다. send() 메서드를 호출하면 objectWillChange publisher는 뷰에 변경 사항을 알리기 위해 이벤트를 발생시킵니다. 이 이벤트를 처리하면 SwiftUI는 뷰를 업데이트합니다.

다음은 ObservableObject을 구현하는 예제입니다.

 

import SwiftUI

class MyModel: ObservableObject {
    @Published var count = 0
    
    func incrementCount() {
        count += 1
        self.objectWillChange.send()
    }
}

 

 

위의 코드에서는 MyModel 클래스가 ObservableObject 프로토콜을 구현합니다. count 변수는 @Published 속성으로 선언되어 있으므로, count 변수가 변경될 때마다 objectWillChange publisher가 자동으로 발행됩니다. incrementCount() 메서드에서는 count 값을 증가시킨 후, objectWillChange publisher의 send() 메서드를 호출하여 변경 사항을 알립니다.

 

이제 SwiftUI 뷰에서 MyModel 클래스를 사용하여 count 값을 업데이트할 수 있습니다. 다음은 SwiftUI에서 MyModel을 사용하는 예제입니다.

 

struct ContentView: View {
    @ObservedObject var model = MyModel()
    
    var body: some View {
        VStack {
            Text("\(model.count)")
            
            Button("Increment") {
                model.incrementCount()
            }
        }
    }
}

 

 

위의 코드에서는 ContentView 구조체가 선언되어 있습니다. 이 구조체는 ObservedObject 프로퍼티 래퍼를 사용하여 MyModel 인스턴스를 관찰합니다. body 프로퍼티에서는 count 값을 텍스트로 표시하고, 버튼을 누르면 incrementCount() 메서드를 호출하여 count 값을 증가시킵니다.

 

이렇게 SwiftUI에서 ObservableObject을 사용하여 데이터 모델과 뷰 간의 데이터 흐름을 제어할 수 있습니다. objectWillChange publisher는 뷰 업데이트를 자동으로 처리하기 때문에, 데이터 변경 시 뷰 업데이트를 관리하기 쉽고 간단합니다.

댓글