使用过程中爬坑记录一下
RxSwift 计数问题
两个页面,A,B.需要实现B页面给A页面传值,可以通过序列实现:
B 的VC:
// 内部序列响应,不被外界影响
fileprivate var mySubject = PublishSubject<Any>()
var publicOB : Observable<Any>{
return mySubject.asObservable()
}
- 对外暴露publicOB,以便订阅信息
- mySubject序列响应,内部事件发送
- 内外区分,达到干净的效果
A VC中:
let vc = LGDetialViewController()
vc.publicOB
.subscribe(onNext: { (item) in
print("订阅到 \(item)")
})
.disposed(by: vc.disposeBag)
self.navigationController?.pushViewController(vc, animated: true)
- 这里注意需要使用vc.disposeBag
cell复用导致序列重复订阅响应
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! LGTableViewCell
cell.button.rx.tap
.subscribe(onNext: { () in
print("点击了 \(indexPath)")
})
.disposed(by: bag)
return cell
}
- 这一段代码乍一看也是没有什么问题的,包括你不滑动屏幕也不会产生问题
- 只要你一划动屏幕,因为我们的
cell
的重用机制,会导致cell.button.rx.tap
的订阅也会重复订阅响应,显然不是我们正常
开发中想见到的样子
点击了 [0, 0]
********************
点击了 [0, 1]
********************
点击了 [0, 2]
********************
点击了 [0, 1]
点击了 [0, 21]
********************
点击了 [0, 3]
点击了 [0, 23]
********************
点击了 [0, 29]
点击了 [0, 49]
点击了 [0, 69]
********************
** 解决思路
- 思路一: 把主动销毁的能力收回,销毁垃圾袋交给我们的cell.disposeBag,在我们重用响应的时候,及时销毁,重置!
// 外界订阅处理
cell.button.rx.tap
.subscribe(onNext: { () in
print("点击了 \(indexPath)")
})
.disposed(by: cell.disposeBag)
// cell内部处理
override func prepareForReuse() {
super.prepareForReuse()
// 销毁垃圾袋重置
disposeBag = DisposeBag()
}
-
销毁垃圾袋交给cell自身
-
在prepareForReuse 响应的时候,销毁垃圾袋重置
-
效果很明显,问题得到了解决!
网友评论