[iOS] MVVM

Architecture

Model: 如同MVC的M

View: ViewController在此只負責處理UI

ViewModel: 原本MVC中controller處理的邏輯移到ViewModel處理, 與View通常會做data binding.

優點: 分工更清楚, 更方便測試

缺點: 如MVC有著一樣的問題, 只是程式碼肥大的部份從ViewController變成了ViewModel

ObservableObject

用於data binding.

class ObservableObject<T> {
    var value: T {
        didSet {
            self.valueChangedClosure?(self.value)
        }
    }
    
    private var valueChangedClosure: ((T)-> (Void))?
    
    init(value: T) {
        self.value = value
    }
    
    func addObserver(isFireNow: Bool = true, _ valueChangedClosure: @escaping (T)-> (Void)) {
        self.valueChangedClosure = valueChangedClosure
        
        if(isFireNow == true) {
            self.valueChangedClosure?(self.value)
        }
    }
    
    func removeObserver() {
        self.valueChangedClosure = nil
    }
}

ex:

class MyViewModel: NSObject {
    var titles = ObservableObject<[String]>(value: []) 
    var selectedIndex = ObservableObject<NSInteger>(value: 0)
}


private func initDataBinding() {
    self.viewModel.titles.addObserver { [weak self] (titles) -> (Void) in
        self?.collectionView.reloadData()
    }
        
    self.viewModel.selectedIndex.addObserver { [weak self] (titles) -> (Void) in
        self?.collectionView.reloadData()
    }
}

Last updated