SwiftUI

[SwiftUI] @ObservedObject 프로퍼티 래퍼는 언제 왜 사용하는가?


Observable 객체

상태 프로퍼티는 뷰의 상태를 저장하는 방법을 제공하며 해당 뷰에만 사용할 수 있다. 즉, 하위 뷰가 아니거나 상태 바인딩이 구현되어 있지 않은 다른 뷰는 접근할 수 없다. 상태 프로퍼티는 일시적인 것이어서 부모 뷰가 사라지면 그 상태도 사라진다.

반면, Observable 객체는 여러 다른 뷰들이 외부에서 접근할 수 있는 영구적인 데이터를 표현하기 위해 사용된다.

Observable 객체는 ObservableObject 프로토콜을 따르는 클래스나 구조체 형태를 취한다.

observable 객체는 게시된 프로퍼티(published property)로서 데이터 값을 게시(publish)한다. 그런 다음, Observer 객체는 게시자를 구독(subscribe)하여 게시된 프로퍼티가 변경될 때마다 업데이트를 받는다.

Combine 프레임워크에 포함되어 있는 Observable 객체는 게시자(publisher)와 구독자 (subscriber) 간의 관계를 쉽게 구축할 수 있도록 iOS 13에 도입되었다.

Observable 객체의 게시된 프로퍼티를 구현하는 가장 쉬운 방법은 프로퍼티를 선언할 때  @Published 프로퍼티 래퍼를 사용하는 것이다. 이 래퍼는 래퍼 프로퍼티 값이 변경될 때마다 모든 구독자에게 업데이트를 알리게 된다.

다음의 구조체 선언은 두 개의 게시된 프로퍼티를 가진 간단한 observable 객체 선언을 보여준다.

import Foundation
import Combine

class DemoData : ObservableObject {
   @Published var userCount = 0    
   @Published var currentUser = ""   
   init() {       
     // 데이터를 초기화하는 코드가 여기에 온다      
     updateData()    
   }    
   func updateData() {     
     // 데이터를 최신 상태로 유지하기 위한 코드가 여기에 온다 
   }
}

구독자는 observable 객체를 구독하기 위하여 @ObservedObject 프로퍼티 래퍼를 사용한다. 구독하게 되면 그 뷰 및 모든 하위 뷰가 상태 프로퍼티에서 사용했던 것과 같은 방식으로 게시된 프로퍼티에 접근하게 된다. 앞의 DemoData 클래스의 인스턴스를 구독하도록 설계된 간단한 SwiftUI 뷰는 다음과 같다.

struct ContentView: View { 
   @ObservedObject var demoData : DemoData  
   var body: some View {      
      Text("(demoData.currentUser), you are user number (demoData.userCount)")  
   }
}

struct ContentView_Previews: PreviewProvider {   
   static var previews: some View {       
      ContentView(demoData: DemoData())   
   }
}
 

게시된 데이터가 변경되면 SwiftUI는 새로운 상태를 반영하도록 자동으로 뷰 레이아웃 렌더링을 다시 할 것이다.

-알라딘 eBook <핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍> (닐 스미스 지음, 황반석 옮김) 중에서

Leave a Reply

error: Content is protected !!