ReactiveCocoa (RAC) TableView(数据篇)

上一篇写了点简单的 KVO的数据绑定,刚了解这个特性的时候,我就想到了 利用到tableview上,感觉可以实现一种非常简单的绑定 model 和cell 的方式,但是经过实践 ,是会出现Bug的,再研究,然后解决掉这个Bug后,感觉对Cell的绑定 操作有点多,对cell展示的流畅性 感觉会产生阻碍,所以又放弃了这种方式,特别简单的Cell还是可以用的,下面让我们来 一起探讨下吧

承接上篇

[RACObserve(model, title) subscribeNext:^(NSString *x) {
        self.textLabel.text = x;
}];

我们经常会有改变cell对应的Model的属性,然后要更新到Cell上的,一般我的做法是 改变Model的属性后,

1.找到Model对应的cell
2.刷新 Model对应的Cell

应该会有一大部分人都是这样做的,如果有更好的办法请评论联系我,回归正题,结合 RAC 我们可以把 Model的属性和 Cell的subviews(label imageView等)绑定在一起,这样就只需要 改变Model的属性的值,就会自动调用 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已经悄无声息的渗透了进来,

让我们来 分析下,

bindModel: 这个方法是给Cell绑定数据用的,
由于Cell是复用的,所以同一个Cell可能 执行 好多次 bindModel: 方法,
也就意味着model的属性 和 cell的UI 会经过多次的绑定,
而且 新的Model的绑定并不会覆盖掉 旧的model的绑定,
这就导致了 cell 绑定了多个Model的属性,
改变任何一个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";

效果

000000.gif

通过这张图,我们看到了 点击 当前cell改变相差10个下标的Model的值,相差1个下表的cell 更新了UI,这显然是一个bug了

Demo代码
https://pan.baidu.com/s/1o8NUh1S 提取码:v624

Bug出现,就该干掉,让我们 解决掉它
既然Bug是由于 多次绑定出现的,那我们就在新的绑定关系发生前,把旧的绑定关系除掉,经过调研,这确实是可行的,我们看下代码
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,发现没有问题了,也达到了我们最初的想法,但是 感觉在cell 绑定数据时发生了太多的操作,RAC 的绑定和解除绑定也有一定的消耗CPU,如果cell过于复杂绑定太多的属性,对于cell的流畅性会有一定的影响,所以采用此方案时,要慎重呀

致此 ,本文 结束,期待大家的评论互动,如果帮到了你,请喜欢收藏下哦,下次见

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,346评论 0 1
  • 原文链接:http://www.sprynthesis.com/2014/12/06/reactivecocoa-...
    阳仔dynamics阅读 1,042评论 0 2
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,114评论 4 61
  • 此篇文章主要介绍了MVC和MVVM的区别和关系;同时阐述了有关函数式的概念;解释了ReactiveCocoa的工作...
    MooGoo阅读 783评论 0 3
  • 皮豆儿与其他狗狗并无不同,院长也不喜打扮它,狗狗就是狗狗吧,别弄得跟人似的。皮豆儿有个爱好,喜欢看电视,喜欢不出门...
    君子包阅读 202评论 2 4