Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@Published 본문

SwiftUI

@Published

JangJupyo 2024. 9. 22. 17:07
728x90
반응형

@Published는 SwiftUI와 Combine에서 데이터 변경을 자동으로 알릴 수 있게 하는 프로퍼티 래퍼입니다. 이 래퍼를 사용하면 클래스에서 상태를 관리하고, 그 상태가 변할 때 자동으로 뷰가 업데이트됩니다. @Published는 ObservableObject와 함께 사용되며, 상태의 변화를 구독자에게 전달하는 역할을 합니다.

 

@Published란?

  • @Published는 SwiftUI에서 프로퍼티의 값이 변경될 때 이를 자동으로 구독자에게 알리는 프로퍼티 래퍼입니다.
  • 주로 ObservableObject를 준수하는 클래스에서 사용되며, 뷰나 다른 객체가 해당 값의 변화를 감지할 수 있습니다.

 

사용 이유

  • 뷰모델이나 데이터 모델에서 상태 변화를 쉽게 관리하고, 자동으로 UI를 업데이트하기 위해 사용됩니다.
  • 상태 변화를 알리는 로직을 구현할 필요 없이 값이 변경되면 즉시 알림을 전달할 수 있습니다.

 

기본 사용 예시

import SwiftUI

class CounterViewModel: ObservableObject {
    @Published var count: Int = 0
    
    func increment() {
        count += 1
    }
}

struct ContentView: View {
    @ObservedObject var viewModel: CounterViewModel
    
    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
                .padding()
            
            Button("Increment") {
                viewModel.increment()
            }
        }
    }
}
  • @Published로 선언된  count는 값이 변경될 때마다 자동으로 변경 사항을 알립니다.
  • ContentView는 @ObservedObject로 viewModel을 감시하고, count 값이 변경 될 때마다 UI가 자동으로 업데이트됩니다.

 

@Published의 특징

  • 자동으로 상태를 알림: @Published로 선언된 프로퍼티가 변경될 때, 해당 변경 사항을 구독자가 즉시 받을 수 있습니다.
  • 간편한 상태 관리: 별도의 상태 변화를 위한 코드를 작성하지 않아도, 데이터 변경에 따른 자동 업데이트가 이루어집니다.
  • 반응형 시스템과 결합: SwiftUI의 반응형 시스템과 결합하여 자동 UI 갱신을 쉽게 구현할 수 있습니다.

 

Combine과의 연동

@Published는 Combine 프레임워크과 자연스럽게 연동됩니다. @Published는 Publisher 역할을 하며, 데이터 흐름을 다른 구독자들에게 전달할 수 있습니다.

import Combine

class TimerViewModel: ObservableObject {
    @Published var time = 0
    var timer: Timer?
    
    func startTimer() {
        timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
            self.time += 1
        }
    }
}
  • 타이머 예시에서 @Published로 선언된 time 프로퍼티는 타이머가 작동할 때마다 값이 증가하며, 구독자가 이를 실시간으로 감지합니다.

 

SwiftUI에서의 사용 패턴

SwiftUI에서 @Published는 뷰모델의 상태가 변경될 때 자동으로 UI에 반영되도록 돕습니다. 이러한 방식으로 뷰와 뷰모델 간 양방향 데이터 바인딩이 가능해집니다.

import SwiftUI

class TextViewModel: ObservableObject {
    @Published var text: String = ""
}

struct TextFieldView: View {
    @ObservedObject var viewModel = TextViewModel()
    
    var body: some View {
        VStack {
            TextField("Enter text", text: $viewModel.text)
            Text("You typed: \(viewModel.text)")
        }
    }
}
  • TextField에 입력한 내용이 자동으로 text 프로퍼티에 바인딩되고, 그 값이 Text 뷰에 실시간으로 반영됩니다.

 

메모리 관리

  • @Published는 클래스 내부에서 상태를 관리하는 것이므로, 상태 변화에 따른 메모리를 신경 써야 합니다.
  • 무한 루프나 메모리 누수를 방지하기 위해 참조 타입인 클래스를 적절하게 관리하는 것이 중요합니다.

 

요약

  • @Published는 프로퍼티의 변화를 구독자에게 알리는 프로퍼티 래퍼입니다.
  • 데이터 변경이 발생하면 자동으로 알림을 보내고, 이를 감시하는 뷰는 자동으로 UI를 업데이트합니다.
  • Combine 프레임워크와의 자연스러운 연동을 통해 상태 변화를 쉽게 관리할 수 있습니다.
반응형

'SwiftUI' 카테고리의 다른 글

GeometryReader  (2) 2024.09.27
@Environment  (0) 2024.09.27
@ObservedObject  (0) 2024.09.21
@Binding  (2) 2024.09.16
@StateObject  (0) 2020.10.15