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
Swift에서 @Published는 ObservableObject 프로토콜과 함께 사용되어, 클래스의 특정 프로퍼티가 변경될 때 이를 자동으로 다른 뷰에 알리는 역할을 합니다. 주로 SwiftUI에서 상태 변화를 뷰에 반영하기 위해 사용되며, 프로퍼티가 변경될 때마다 뷰가 자동으로 다시 렌더링되도록 돕습니다.
간단한 예시로 살펴보면:
import SwiftUI
import Combine
class ViewModel: ObservableObject {
@Published var name: String = ""
}
위 예제에서 name 프로퍼티에 @Published 속성이 적용되어, name 값이 변경될 때마다 이 값을 관찰하는 뷰들이 자동으로 업데이트됩니다.
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)
}
}
설명:
- @Published 프로퍼티는 변경될 때마다 뷰가 자동으로 업데이트되며, 이를 통해 sink 클로저 내부에서 name 값이 변경될 때마다 특정 작업을 수행할 수 있습니다.
- cancellables는 Combine의 구독을 저장해 구독이 유지되도록 관리하는 데 필요합니다.
이 방법으로 프로퍼티 변경 시마다 특정 작업을 실행할 수 있습니다!
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 |
---|