RxSwift <11>—— 爬坑

使用过程中爬坑记录一下
RxSwift 计数问题
两个页面,A,B.需要实现B页面给A页面传值,可以通过序列实现:
B 的VC:

// 内部序列响应,不被外界影响
fileprivate var mySubject = PublishSubject()
var publicOB : Observable{
    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 响应的时候,销毁垃圾袋重置

  • 效果很明显,问题得到了解决!

你可能感兴趣的:(RxSwift <11>—— 爬坑)