모바일&임베디드/iOS

Combine

차가운오미자 2024. 10. 30. 23:04

ObservableObject 를 상속받는 클래스에서 

@Published 를 통해서 특정 프로퍼티를 구독 대상으로 만들 수 있다

 

import SwiftUI
import Combine

class ViewModel: ObservableObject {
    @Published var name: String = "" {
        didSet {
            // name이 변경될 때마다 처리할 코드
            print("Name changed to: \(name)")
        }
    }
    
    private var cancellables = Set<AnyCancellable>()
    
    init() {
        // objectWillChange 구독 설정
        self.$name
            .sink { newValue in
                print("New name value: \(newValue)")
                // 원하는 처리를 여기에 추가
            }
            .store(in: &cancellables)
    }
}

위 코드에서 name 이 Published 니까 name 의 값이 바뀔 때 이걸 구독하고 있는 친구의 뷰가 바뀌게 된다는 것

init() 에서 .sink 를 통해서 구독설정을 했고 .store 을 통해서 cancellables 라는 구독 목록에 추가를 했다

 

ChatGPT says

 
Q. @Published 가 swift 에서 뭐였지
A. ChatGPT

Swift에서 @Published는 ObservableObject 프로토콜과 함께 사용되어, 클래스의 특정 프로퍼티가 변경될 때 이를 자동으로 다른 뷰에 알리는 역할을 합니다. 주로 SwiftUI에서 상태 변화를 뷰에 반영하기 위해 사용되며, 프로퍼티가 변경될 때마다 뷰가 자동으로 다시 렌더링되도록 돕습니다.

간단한 예시로 살펴보면:

import SwiftUI
import Combine

class ViewModel: ObservableObject {
    @Published var name: String = ""
}
 
 

위 예제에서 name 프로퍼티에 @Published 속성이 적용되어, name 값이 변경될 때마다 이 값을 관찰하는 뷰들이 자동으로 업데이트됩니다.

 
Q. 그럼 ObservableObject 를 이용해서 해당 프로퍼티가 변경되었을 때 처리를 하도록 하는 코드는 어떻게 작성해?
 

A. ChatGPT

ObservableObject를 사용하여 프로퍼티가 변경될 때 특정 처리를 실행하려면 objectWillChange를 이용할 수 있습니다. objectWillChange는 ObservableObject에서 제공하는 Combine의 Publisher로, 프로퍼티가 변경되기 직전에 이벤트를 발생시킵니다. 이 이벤트에 구독하여 원하는 로직을 실행할 수 있습니다.

예를 들어 name 프로퍼티가 변경될 때마다 특정 처리를 수행하는 코드:

import SwiftUI
import Combine

class ViewModel: ObservableObject {
    @Published var name: String = "" {
        didSet {
            // name이 변경될 때마다 처리할 코드
            print("Name changed to: \(name)")
        }
    }
    
    private var cancellables = Set<AnyCancellable>()
    
    init() {
        // objectWillChange 구독 설정
        self.$name
            .sink { newValue in
                print("New name value: \(newValue)")
                // 원하는 처리를 여기에 추가
            }
            .store(in: &cancellables)
    }
}

설명:

  1. @Published 프로퍼티는 변경될 때마다 뷰가 자동으로 업데이트되며, 이를 통해 sink 클로저 내부에서 name 값이 변경될 때마다 특정 작업을 수행할 수 있습니다.
  2. cancellables는 Combine의 구독을 저장해 구독이 유지되도록 관리하는 데 필요합니다.

이 방법으로 프로퍼티 변경 시마다 특정 작업을 실행할 수 있습니다!

 
Q. 위 코드에서 self.$name은 무슨 의미야
A. ChatGPT

self.$name에서 $name은 @Published로 선언된 프로퍼티에 자동 생성된 Publisher를 의미합니다. Swift에서 @Published 프로퍼티에 $를 붙이면, 그 프로퍼티의 변경을 감지하는 Publisher에 접근할 수 있게 됩니다.

작동 원리:

  • @Published var name: String으로 선언된 프로퍼티는 자동으로 $name이라는 Publisher를 생성합니다.
  • 이 Publisher는 name 프로퍼티가 변경될 때마다 새로운 값을 내보내며, 이를 구독하는 코드는 업데이트를 받게 됩니다.

위 코드에서 self.$name.sink를 통해 구독을 설정했기 때문에, name이 변경될 때마다 sink 클로저가 호출됩니다.

요약

  • @Published로 선언된 프로퍼티에 $를 붙이면 그 프로퍼티의 Publisher에 접근할 수 있습니다.
  • self.$name은 name 프로퍼티의 Publisher에 접근하는 코드로, name이 변경될 때마다 구독한 코드가 실행됩니다.

 

'모바일&임베디드 > iOS' 카테고리의 다른 글

List, Grid  (0) 2024.04.14