Danny의 iOS 컨닝페이퍼
article thumbnail

Observable

직접 만든 Observable이

어떤식으로 동작을 관찰하고 업데이트하는지 알고 싶어서 작성했습니다.

class Observable<T> {
    
    // 2. value가 변하면 didSet에 의해 변경된 value 값을 갖고 listener 동작을 실행합니다.
    var value: T? {
        didSet {
            self.listener?(value)
        }
    }
    
    init(_ value: T?) {
        self.value = value
    }
    
    // 동작을 담아두는 클로저입니다. (실행 X)
    private var listener: ((T?) -> Void)?
    
    // 1. 이 함수가 호출이 되면 아래와 같은 작업을 실행
    func bind(_ listener: @escaping (T?) -> Void) {
        // completion에서 value의 값을 갖고 동작을 실행시킨다.
        listener(value)
        // 다음으로 위의 동작을 listener에 저장시킨다.
        self.listener = listener
    }
}

 

 

ViewController & ViewModel

class CartViewModel {
    var item: Observable<Int> = Observable(0)
}

class Cart {
    var viewModel = CartViewModel()
    var itemcCount = 0
    
    func setBinding() {
        viewModel.item.bind { [weak self] num in
            guard let num = num else { return }
            self?.itemcCount = num
        }
    }
    
    func addCount(n: Int) {
        viewModel.item.value = n
    }
}

 

 

실행

let cart = Cart()

// 이 바인딩을 실행시켜주면 동작 실행 및 동작을 저장
cart.setBinding()
print(cart.itemcCount)
// 값이 바뀌면 didSet이 동작하며 setBinding에 저장해둔 동작을 실행
cart.addCount(n: 10)
print(cart.itemcCount)
cart.addCount(n: 20)
print(cart.itemcCount)
cart.addCount(n: 30)
print(cart.itemcCount)

// 0
// 10
// 20
// 30
반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!