美文网首页Rx
RxSwift(19)——Rx框架能力扩展

RxSwift(19)——Rx框架能力扩展

作者: 无悔zero | 来源:发表于2020-11-08 16:06 被阅读0次

    上次分析了deallocatingdeallocated,除了这两个是否还有别的,好像并没有。如果没有,那我们就模仿写出来,扩展Rx的能力。比如下面的例子:

    extension Reactive where Base: UITableViewCell {
    
        public var prepareForReuse: RxSwift.Observable<Void> {
            var prepareForReuseKey: Int8 = 0
            if let prepareForReuseOB = objc_getAssociatedObject(base, &prepareForReuseKey) as? Observable<Void> {
                return prepareForReuseOB
            }
            let prepareForReuseOB = Observable.of(
                sentMessage(#selector(Base.prepareForReuse)).map { _ in }
                , deallocated)
                .merge()
            objc_setAssociatedObject(base, &prepareForReuseKey, prepareForReuseOB, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    
            return prepareForReuseOB
            
        }
        
        public var reuseBag: DisposeBag {
            MainScheduler.ensureExecutingOnScheduler()
            
            var prepareForReuseBag: Int8 = 0
            if let bag = objc_getAssociatedObject(base, &prepareForReuseBag) as? DisposeBag {
                return bag
            }
            
            let bag = DisposeBag()
            objc_setAssociatedObject(base, &prepareForReuseBag, bag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            
            _ = sentMessage(#selector(Base.prepareForReuse))
                .subscribe(onNext: { [weak base] _ in
                    let newBag = DisposeBag()
                    guard let base = base else {return}
                    objc_setAssociatedObject(base, &prepareForReuseBag, newBag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
                })
            return bag
        }
    }
    

    我们使用RxSwift和UITableView的同时,可能会遇到重用和内存之间的问题,上面的例子就是为解决这个问题而写的,比如rx.prepareForReuse是为了监听cellprepareForReuserx.reuseBag是为了给cell添加一个垃圾袋,都可以解决问题:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
        
        cell.button.rx.tap
            .takeUntil(cell.rx.prepareForReuse)
            .subscribe(onNext: { () in
                print("点击了 \(indexPath)")
            })
        
        return cell
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
        
        cell.button.rx.tap
            .subscribe(onNext: { () in
                print("点击了 \(indexPath)")
            }).disposed(by: cell.rx.reuseBag)
        
        return cell
    }
    

    相关文章

      网友评论

        本文标题:RxSwift(19)——Rx框架能力扩展

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