Goo:基于MVVM的IOS實(shí)現(xiàn)(上)

Goo是基于MVVM模式進(jìn)行IOS開發(fā)的一個(gè)美妙的粘合劑,實(shí)現(xiàn)View中元素屬性與ViewModel中數(shù)據(jù)的對接。

Goo具有簡單、易懂、靈活并且只在你需要的時(shí)候進(jìn)行使用的特點(diǎn)。

Goo試圖解決什么問題

  1. 解決傳統(tǒng)IOS開發(fā)過程中,UI和Model雙向賦值
  2. 界面元素比較難于測試的
  3. 實(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等多種模式

  1. 無論是UI元素屬性還是ViewModel屬性,只要發(fā)生了更改,TwoWay 就會進(jìn)行彼此更新。
  2. OneWay 僅當(dāng)ViewModel屬性發(fā)生更改時(shí)更新UI元素屬性。
  3. TempWay晉檔初次綁定時(shí)更新UI元素屬性

具體實(shí)現(xiàn)

來看UIControl+GBindingSupport.m的bindingWithProperty方法通過以下幾個(gè)步驟完成綁定工作。

  1. 更新綁定屬性
    [self.bindingProperty updateBindingProperty:object withDataSource:dataSource withProperty:property withBindingMode:mode];
  2. 對ViewModel進(jìn)行增加觀察者
    [object addObserver:self forKeyPath:dataSource options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
  3. 為自身增加觀察者
    [self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
  4. 在觀察者中完成對賦值操作
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{...}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容