oc rac在tableViewCell中的坑

2018-06-14  本文已影响0人  纳兰怮翌

这次做的项目中用到了rac这个第三方的控件,第一次用嘛,感觉很好用,也是没有经验,但是确实代码量减少了很多,同时对于项目中大量用到代理,通知都阔以用block的方式来代替,我是觉得很好用的,但是坑也很多
第一个坑就是cell重用的导致回调多次的原因
声明一点我个人喜欢将cell里面的东西完全的写在cell里面包括初始化都喜欢在里面初始化,所以在外面暴露的就只有cell的赋值方法
先来看看填坑之前的写法

  //在cell文件里面调用的
  //在.h文件里面声明代理
@property (nonatomic, strong)RACSubject *submitDelegateSignal,*imageDelegateSignal,*fileDelegateSignal;
//在.m文件里面初始化
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _ submitDelegateSignal = [RACSubject subject];
        [[_submitButton rac_signalForControlEvents:UIControlEventTouchUpInside]  subscribeNext:^(__kindof UIControl * _Nullable x) {
            if (_submitDelegateSignal) {
                [_submitDelegateSignal sendNext:_model];
            }
        }];
     }
return self;
}
//在tableView 的 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法里面直接调用
[cell.submitDelegateSignal subscribeNext:^(id  _Nullable x)  {
        NSLogin(@"sssss");
    }];

这样写了之后你会发现刚进这个界面是没有问题的,只打印一次,当数据加载多了之后出现分页之后就会发现会多次重复的打印
解决办法

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    cell.submitDelegateSignal = [RACSubject subject];
    [cell.submitDelegateSignal subscribeNext:^(id  _Nullable x)  {
        NSLogin(@"sssss");
    }];
}
//在cell.m文件中
[[[_submitButton rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(__kindof UIControl * _Nullable x) {
            if (_submitDelegateSignal) {
                [_submitDelegateSignal sendNext:_model];
            }
        }];

但是我在网上看见踩过坑的前辈都是用的self.rac_deallocDisposable这个来代替self.rac_willDeallocSignal ,我现在还不知道原理,还在研究中,所以有知道的大佬能给我说一下,谢谢

上一篇 下一篇

猜你喜欢

热点阅读