[swift] 데이터 변화에 따른 다중 뷰 간의 동기화

앱을 개발하다 보면 서로 다른 뷰들 간에 데이터를 공유하고 동기화하는 일이 중요합니다. 특히 데이터가 변경될 때 다른 뷰들도 그 변경을 즉시 반영해야 하는 경우가 많습니다. Swift에서는 데이터 변화에 따른 다중 뷰 간의 동기화를 쉽게 처리할 수 있는 방법이 있습니다.

NotificationCenter 활용

Swift에서 데이터의 변화를 감지하고 다른 뷰들에게 알리기 위해 NotificationCenter를 활용할 수 있습니다. 이를 통해 데이터 변경 시 특정 이벤트를 발생시키고, 이를 구독하고 있는 다른 뷰들은 이를 감지하여 적절히 처리할 수 있습니다.

다음은 NotificationCenter를 사용하여 데이터 변화를 다른 뷰들에게 알리는 예시입니다.

// 데이터가 변경될 때 NotificationCenter를 통해 알림을 보냄
func dataDidChange() {
    NotificationCenter.default.post(name: NSNotification.Name("DataDidChangeNotification"), object: nil)
}

// 데이터 변경을 감지하여 처리하는 다른 뷰
NotificationCenter.default.addObserver(forName: NSNotification.Name("DataDidChangeNotification"), object: nil, queue: nil) { notification in
    // 데이터 변경에 따른 동작 수행
}

위의 예시에서 dataDidChange 함수를 통해 데이터 변경시 DataDidChangeNotification이라는 이름의 알림을 보내고, 이를 구독하고 있는 다른 뷰는 addObserver(forName:object:queue:using:) 메서드를 사용하여 데이터 변경을 감지하고 처리합니다.

Combine 프레임워크 활용

Swift 5부터 도입된 Combine 프레임워크는 데이터의 변화를 감지하고 처리하는 데 유용합니다. 이를 통해 데이터의 변화를 Publisher로 정의하고, 해당 Publisher를 구독하는 Subscriber에게 데이터 변경을 즉시 전달할 수 있습니다.

다음은 Combine 프레임워크를 사용하여 데이터 변화를 다른 뷰들에게 알리는 예시입니다.

import Combine

class DataStore {
    @Published var data: String = ""
}

// 데이터 변경을 감지하여 처리하는 다른 뷰
class DataView {
    var dataStore = DataStore()
    var cancellables = Set<AnyCancellable>()

    init() {
        dataStore.$data.sink { [weak self] newData in
            // 데이터 변경에 따른 동작 수행
        }.store(in: &cancellables)
    }
}

위의 예시에서 DataStore 클래스의 @Published 속성을 통해 데이터의 변화를 Publisher로 정의하고, DataView 클래스는 해당 데이터를 구독하여 데이터의 변경을 즉시 감지하고 처리합니다.

다양한 방법을 통해 Swift에서 데이터 변화에 따른 다중 뷰 간의 동기화를 쉽게 구현할 수 있으며, 각 상황에 맞게 적합한 방법을 선택하여 사용할 수 있습니다.

이러한 방법들을 활용하여 앱의 다양한 뷰들 간에 데이터를 효과적으로 공유하고 동기화할 수 있습니다.


참고 자료: