美文网首页
RxSwift <11>—— 爬坑

RxSwift <11>—— 爬坑

作者: Gollum_ | 来源:发表于2019-10-22 10:33 被阅读0次

    使用过程中爬坑记录一下
    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 响应的时候,销毁垃圾袋重置

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

    相关文章

      网友评论

          本文标题:RxSwift <11>—— 爬坑

          本文链接:https://www.haomeiwen.com/subject/iyofvctx.html