[swift] 데이터의 실시간 업데이트와 UI 반응

많은 애플리케이션에서는 데이터의 실시간 업데이트를 통해 사용자 경험을 높이고, 실시간으로 변화하는 데이터를 표시하는 UI를 제공하는 것이 중요합니다. Swift에서는 데이터의 실시간 업데이트를 감지하고 UI를 반응시키는 방법에 대해 살펴보겠습니다.

관찰자 패턴(Observer Pattern)

관찰자 패턴은 객체 간에 일대다의 종속 관계를 정의합니다. 한 객체의 상태가 변하면, 이를 관찰하는 다른 객체들에게 자동으로 알립니다. Swift에서는 관찰자 패턴을 활용하여 데이터의 변화를 감지하고 UI를 갱신할 수 있습니다.

import Foundation

// Observable 데이터 모델
class Observable {
    var data: String = "Initial" {
        didSet {
            notifyObservers()
        }
    }
    
    private var observers = [Observer]()
    
    func addObserver(_ observer: Observer) {
        observers.append(observer)
    }
    
    func removeObserver(_ observer: Observer) {
        observers = observers.filter { $0 !== observer }
    }
    
    private func notifyObservers() {
        observers.forEach { observer in
            observer.update()
        }
    }
}

// Observer 프로토콜
protocol Observer: AnyObject {
    func update()
}

// Observer로 구현된 클래스
class SomeObserver: Observer {
    func update() {
        // 데이터 변화에 따른 UI 업데이트 로직
    }
}

위 코드에서 Observable 클래스는 데이터의 변화를 감지하고, 등록된 관찰자들에게 알립니다. Observer 프로토콜을 준수하는 클래스는 update() 메서드를 구현하여 데이터의 변화에 따른 UI 업데이트 로직을 작성합니다.

Combine 프레임워크 활용

Swift의 Combine 프레임워크는 데이터의 변화를 처리하고, 다양한 비동기 작업을 조합할 수 있는 강력한 도구입니다. 데이터의 실시간 업데이트와 UI 반응을 위해 Combine 프레임워크를 활용하는 방법은 다음과 같습니다.

import SwiftUI
import Combine

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

struct ContentView: View {
    @ObservedObject var viewModel: ViewModel
    
    var body: some View {
        Text(viewModel.data)
            .onReceive(viewModel.$data) { newData in
                // 새로운 데이터를 받아 UI를 업데이트하는 로직
            }
    }
}

위 코드에서 ViewModel 클래스는 @Published 속성 래퍼를 사용하여 데이터의 변화를 Publisher로 만들고, ContentView는 해당 데이터를 구독하여 UI를 업데이트합니다.

이러한 방식으로 Swift에서 데이터의 실시간 업데이트와 UI 반응을 구현할 수 있습니다. 데이터의 변화를 관찰하고, 이에 따라 UI를 업데이트하여 사용자에게 실시간으로 변화하는 데이터를 보여줄 수 있습니다.

참고 자료