这次做的项目中用到了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 ,我现在还不知道原理,还在研究中,所以有知道的大佬能给我说一下,谢谢
网友评论