上一篇寫了點簡單的 KVO的數(shù)據(jù)綁定快骗,剛了解這個特性的時候娜庇,我就想到了 利用到tableview上,感覺可以實現(xiàn)一種非常簡單的綁定 model 和cell 的方式方篮,但是經(jīng)過實踐 名秀,是會出現(xiàn)Bug的,再研究恭取,然后解決掉這個Bug后泰偿,感覺對Cell的綁定 操作有點多,對cell展示的流暢性 感覺會產(chǎn)生阻礙蜈垮,所以又放棄了這種方式耗跛,特別簡單的Cell還是可以用的裕照,下面讓我們來 一起探討下吧
承接上篇
[RACObserve(model, title) subscribeNext:^(NSString *x) {
self.textLabel.text = x;
}];
我們經(jīng)常會有改變cell對應(yīng)的Model的屬性,然后要更新到Cell上的调塌,一般我的做法是 改變Model的屬性后晋南,
1.找到Model對應(yīng)的cell
2.刷新 Model對應(yīng)的Cell
應(yīng)該會有一大部分人都是這樣做的,如果有更好的辦法請評論聯(lián)系我羔砾,回歸正題负间,結(jié)合 RAC 我們可以把 Model的屬性和 Cell的subviews(label imageView等)綁定在一起,這樣就只需要 改變Model的屬性的值姜凄,就會自動調(diào)用 rac的block政溃,cell.m里的代碼如下
-(void)bindModel:(YFRACTestModel *)model
{
[RACObserve(model, title) subscribeNext:^(NSString *x) {
self.textLabel.text = x;
}];
[RACObserve(model, sex) subscribeNext:^(NSString *x) {
self.detailTextLabel.text = x;
}];
}
好像很方便呢,一口氣寫 10個列表好像都不費力了呢
我也高興了好一陣子态秧,覺得 春天到了董虱,寫程序也是一件不累人多拿錢的活呢,仔細一想 我的天哪申鱼,Bug已經(jīng)悄無聲息的滲透了進來愤诱,
讓我們來 分析下,
bindModel: 這個方法是給Cell綁定數(shù)據(jù)用的捐友,
由于Cell是復(fù)用的淫半,所以同一個Cell可能 執(zhí)行 好多次 bindModel: 方法,
也就意味著model的屬性 和 cell的UI 會經(jīng)過多次的綁定,
而且 新的Model的綁定并不會覆蓋掉 舊的model的綁定匣砖,
這就導(dǎo)致了 cell 綁定了多個Model的屬性科吭,
改變?nèi)魏我粋€Model的值,都會更新cell的顯示脆粥,這顯然不是我們想要的
我們寫個tableView的Demo來驗證下砌溺,
點擊cell改變Model的值,看看哪個Cell會更新,
附上 點擊cell的代碼
if (indexPath.row - 10 < 0)
{
NSLog(@"請點擊更下方的cell");
return;
}
YFRACTestModel *model = self.dataArray[indexPath.row - 10];
model.sex = @"00000";
效果
通過這張圖变隔,我們看到了 點擊 當前cell改變相差10個下標的Model的值规伐,相差1個下表的cell 更新了UI,這顯然是一個bug了
Demo代碼
https://pan.baidu.com/s/1o8NUh1S 提取碼:v624
Bug出現(xiàn)匣缘,就該干掉猖闪,讓我們 解決掉它
既然Bug是由于 多次綁定出現(xiàn)的,那我們就在新的綁定關(guān)系發(fā)生前肌厨,把舊的綁定關(guān)系除掉培慌,經(jīng)過調(diào)研,這確實是可行的柑爸,我們看下代碼
cell.m 代碼
#import "YFTestCell.h"
#import <ReactiveCocoa.h>
@implementation YFTestCell
{
RACDisposable * _lastTitleSig;
RACDisposable * _lastSexSig;
}
-(void)bindModel:(YFRACTestModel *)model
{
// 解除 上一個model的 綁定
[_lastTitleSig dispose];
[_lastSexSig dispose];
__weak typeof(self)weakS = self;
RACDisposable * titleSig = [RACObserve(model, title) subscribeNext:^(NSString *x) {
weakS.textLabel.text = x;
}];
RACDisposable * sexSig = [RACObserve(model, sex) subscribeNext:^(NSString *x) {
weakS.detailTextLabel.text = x;
}];
// 記錄 當前model的 綁定吵护,下一次綁定時,先解除綁定
_lastTitleSig = titleSig;
_lastSexSig = sexSig;
}
@end
重新運行我們的Demo,發(fā)現(xiàn)沒有問題了馅而,也達到了我們最初的想法祥诽,但是 感覺在cell 綁定數(shù)據(jù)時發(fā)生了太多的操作,RAC 的綁定和解除綁定也有一定的消耗CPU瓮恭,如果cell過于復(fù)雜綁定太多的屬性雄坪,對于cell的流暢性會有一定的影響,所以采用此方案時屯蹦,要慎重呀
致此 维哈,本文 結(jié)束,期待大家的評論互動登澜,如果幫到了你阔挠,請喜歡收藏下哦,下次見