Goo是基于MVVM模式進(jìn)行IOS開發(fā)的一個(gè)美妙的粘合劑,實(shí)現(xiàn)View中元素屬性與ViewModel中數(shù)據(jù)的對接。
Goo具有簡單、易懂、靈活并且只在你需要的時(shí)候進(jìn)行使用的特點(diǎn)。
Goo試圖解決什么問題
- 解決傳統(tǒng)IOS開發(fā)過程中,UI和Model雙向賦值
- 界面元素比較難于測試的
- 實(shí)現(xiàn)以數(shù)據(jù)為核心驅(qū)動(dòng)UI行為和顯示
Goo的實(shí)現(xiàn)方案
Goo通過擴(kuò)展IOS中的UIControl和UIView,利用KVO和KVC的方式實(shí)現(xiàn)ViewModel和View的綁定。

Goo設(shè)計(jì).png
#######示例代碼
[self.inputTextbindingWithProperty:@"text"withObject:_vmwithDataSource:@"text"withBindingMode:TwoWay];
上述代碼意味把self.inputText這個(gè)組件的text屬性與_vm這個(gè)ViewModel的text進(jìn)行綁定,產(chǎn)生關(guān)聯(lián)。
數(shù)據(jù)綁定
[self.inputTextbindingWithProperty:@"text"withObject:_vmwithDataSource:@"text"withBindingMode:TwoWay];
其中關(guān)于BindingMode代表數(shù)據(jù)綁定的模式,在Goo中支持TempWay、OneWay、TwoWay等多種模式
- 無論是UI元素屬性還是ViewModel屬性,只要發(fā)生了更改,TwoWay 就會進(jìn)行彼此更新。
- OneWay 僅當(dāng)ViewModel屬性發(fā)生更改時(shí)更新UI元素屬性。
- TempWay晉檔初次綁定時(shí)更新UI元素屬性
具體實(shí)現(xiàn)
來看UIControl+GBindingSupport.m的bindingWithProperty方法通過以下幾個(gè)步驟完成綁定工作。
- 更新綁定屬性
[self.bindingProperty updateBindingProperty:object withDataSource:dataSource withProperty:property withBindingMode:mode]; - 對ViewModel進(jìn)行增加觀察者
[object addObserver:self forKeyPath:dataSource options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - 為自身增加觀察者
[self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; - 在觀察者中完成對賦值操作
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{...}