[swift] 사용자 정의 뷰에서 데이터 흐름 관리하기

사용자 정의 뷰를 만들 때 종종 데이터를 관리하고 표현해야 합니다. 이를 위해서는 데이터 흐름을 효과적으로 관리해야 합니다. 이번 글에서는 Swift로 사용자 정의 뷰에서 데이터 흐름을 관리하는 방법을 알아보겠습니다.

데이터 바인딩

사용자 정의 뷰에서 데이터 흐름을 관리하는 일반적인 방법은 데이터 바인딩입니다. 데이터 바인딩은 뷰와 데이터를 연결하여 뷰가 데이터의 변경을 실시간으로 반영할 수 있도록 합니다.

class CustomView: UIView {
    var data: String = "" {
        didSet {
            // 데이터 변경에 따른 뷰 업데이트 로직
        }
    }
}

위의 예시에서 data 프로퍼티가 변경될 때마다 didSet 블록 내에서 뷰를 업데이트할 수 있습니다. 이를 통해 데이터의 변경에 따라 뷰를 업데이트할 수 있습니다.

프로토콜과 델리게이트

다른 방법으로는 프로토콜과 델리게이트를 사용하는 것이 있습니다. 이는 데이터 소스와 뷰를 분리하여 데이터의 변경 사항을 뷰에 전달하는 방법입니다.

protocol CustomViewDelegate: AnyObject {
    func dataDidChange(newData: String)
}

class CustomView: UIView {
    weak var delegate: CustomViewDelegate?

    var data: String = "" {
        didSet {
            delegate?.dataDidChange(newData: data)
        }
    }
}

위의 예시에서 CustomViewDelegate 프로토콜을 정의하고, CustomView 클래스에서 이를 채택하여 데이터 변경 사항을 뷰 밖으로 전달할 수 있습니다.

Combine 및 RxSwift

더 복잡한 데이터 흐름을 다루는 경우에는 Combine이나 RxSwift를 사용하는 것이 유용합니다. 이를 사용하면 데이터의 비동기적인 변화를 처리하고 관리할 수 있습니다.

예시 코드:

import Combine

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

class CustomView: UIView {
    private var cancellables = Set<AnyCancellable>()
    
    var viewModel = CustomViewModel()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        viewModel.$data
            .sink { [weak self] newData in
                // 데이터 변경에 따른 뷰 업데이트 로직
            }
            .store(in: &cancellables)
    }
}

위의 예시에서 @Published 속성을 사용하여 데이터의 변경을 구독하고, sink를 통해 데이터의 변화를 감지하고 뷰를 업데이트할 수 있습니다.

마치며

이렇게 Swift에서 사용자 정의 뷰에서 데이터 흐름을 관리하는 방법을 알아보았습니다. 각각의 방법은 상황에 따라 적합한 방법을 선택하여 사용하시면 됩니다. 데이터 바인딩, 프로토콜과 델리게이트, 그리고 Combine 및 RxSwift를 통해 각각의 상황에 적합한 방법을 선택할 수 있습니다.

참고 자료