본문 바로가기
iOS/SwiftUI

[SwiftUI] Observable 객체

by Sky Titan 2022. 1. 16.
728x90
 

핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍 - YES24

SwiftUI는 물론 애플리케이션 개발과 출시를 위한 모든 과정을 담았다!이 책의 목적은 SwiftUI와 Xcode 11, 그리고 스위프트 5 프로그래밍 언어를 사용하여 iOS 13 애플리케이션 제작 기술을 전달하는 데

www.yes24.com

Observable 객체

  • 상태 프로퍼티는 하위 뷰가 아니거나 상태 바인딩이 구현되어 있지 않은 다른 뷰는 접근할 수 없다.
  • 상태 프로퍼티는 일시적인 것이어서 부모 뷰가 사라지면 그 상태도 사라진다.
  • 하지만 Observable 객체는 여러 다른 뷰들이 외부에서 접근할 수 있는 영구적인 데이터를 표현하기 위해 사용된다.
  • Observable 객체는 ObservableObject 프로토콜을 따르는 클래스, 구조체 형태를 취한다.
    • 일반적으로 시간에 따라 변경되는 하나 이상의 데이터 값을 모으고 관리하는 역할을 담당한다.
    • 타이머, 알림(notification)과 같은 이벤트를 처리하기 위해 사용되기도 한다.

 

게시자(publisher) - 구독자(subscriber)

  • Observable 객체는 게시된 프로퍼티(published property)로서 데이터 값을 게시(publish) 한다.
  • Observer 객체는 게시자를 구독(subscribe)하여 게시된 프로퍼티가 변경될 때마다 업데이트 받는다.
  • SwiftUI 뷰는 Observable 객체에 저장된 데이터가 변경됨을 반영하기 위해 자동으로 업데이트 된다.

 

Combine 프레임워크

  • Combine 프레임워크에 포함된 Observable 객체는 게시자(publisher) - 구독자(subscriber) 간의 관계를 쉽게 구축하도록 iOS13에 도입되었다.
  • Combine 프레임워크는 여러 게시자를 하나의 스트림으로 병합, 게시된 데이터를 구독자 요구에 맞게 변형하는 것까지 다양한 작업을 수행하는 커스텀 게시자 구축 플랫폼을 제공한다.

 

Example

  • listData라는 '게시된 프로퍼티'를 가지는 Observable 객체를 구현한다.
  • listData에 데이터가 추가될 때마다 ContentView를 새로 그리게 된다.
import SwiftUI

struct ContentView: View {
    
    @ObservedObject var data: DemoData = DemoData()
    
    var body: some View {
        VStack {
            // 현재 리스트에 있는 숫자들을 보여준다.
            Text(data.listData.description)
            
            // 버튼을 클릭할 때마다 리스트에 5라는 숫자가 append 된다.
            Button(action: {
                data.listData.append(5)
            }, label: {
                Text("Click")
            })
        }
    }
}

class DemoData: ObservableObject {
    @Published var listData: [Int] = [0, 1, 2]
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 11")
            .previewDisplayName("아이폰 11")
    }
}

 

 

728x90

댓글