반응형

 

Hacking with Swift 사이트의 강좌 번역본입니다.

 

[원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-send-state-updates-manually-using-objectwillchange]

 

How to send state updates manually using objectWillChange

 

비록 컨트롤 상태(state)를 업데이트 하기 위해 @Published를 사용하는 것이 가장 쉬운 방법지만, 특별히 필요한 경우에 직접 처리 할 수 있습니다. 예를들어, 주어진 값을 만족하는 경우에만 뷰를 업데이트 할지도 모릅니다. 

 

이러한 접근법은 3 단계로 사용합니다: Combine 프레임워크를 포함(importing)하고, publisher를 추가하고, publisher를 사용합니다. Publishers는 Combine이 SwiftUI가 1개 이상의 뷰에서 관찰하고 있는 모든 변경사항을 알려주는 방법입니다. 

 

다음은 예제 코드 입니다.

import Combine
import SwiftUI

class UserAuthentication: ObservableObject {
    let objectWillChange = ObservableObjectPublisher()

    var username = "" {
        willSet {
            objectWillChange.send()
        }
    }
}

 

코드를 이해가기 쉽도록 세분화 합시다. 우선 다음에 오는 것을 가지고 있습니다. 

let objectWillChange = ObservableObjectPublisher()

 

ObservableObjectPubliser의 인스턴스로 objectWillChange 프로퍼티를 만듭니다. 이것은 Combine 프레임워크에서 가져온 것이며, 코드를 컴파일 하기 위해서 import Combine을 추가해야 합니다. observable 객체 publisher가 하는 일은 간단합니다: 우리 객체가 변경되었다는 것을 알리고자 할때마다, 이를 publisher에게 요청합니다. 

 

두번째, UserAuthentication username 프로퍼티에 willSet 프로퍼티 observer가 붙여있으므로 값이 변경될때마다 코드를 실행할 수 있습니다. 예제 코드에서, username이 변경될때마다 objectWillChange.send()를 호출하며, objectWillChangepublisher가 데이터가 변경되었다는 소식을 알려주므로, 구독했던 뷰들은 갱신할 수 있습니다. 

 

UserAuthentication 클래스는 ObservableObject를 준수하며, @ObservedObject 프로퍼티 처럼 사용할 수 있습니다. 따라서 다음과 같이 사용자가 입력할때 입력한 것을 표시하는데 사용할 수도 있습니다. 

struct ContentView: View {
    @ObservedObject var settings = UserAuthentication()

    var body: some View {
        VStack {
            TextField("Username", text: $settings.username)
                .textFieldStyle(RoundedBorderTextFieldStyle())

            Text("Your username is: \(settings.username)")
        }
    }
}

 

반응형
Posted by 까칠코더
,