• RxSwift 对 MJRefresh 使用的封装


    对于一个很常用的两个库, MJRefresh 如何可以像 UIButton 使用方式呢:

    btn.rx.tap.subscribe(...)

    Rxswift 中的很多类似处理的方式都使用了跟下面极为相似的代码,

    进行针对UIControl的适配时,是通过一个中间层ControlTarget来完成的,为了保持这个ControlTarget实例的存活,使得它不会被自动释放,先用一个集合来包裹住它,并将这个集合设置为目标UIControl的关联对象。此时我们可以将这个中间层ControlTarget看做是这个事件流管道中的一个资源,这个资源的销毁是由目标UIControl来决定的
    
    

    个人写的代码如下:

    import UIKit
    import MJRefresh
    import RxSwift
    import RxCocoa
    
    class RxTarget: NSObject, Disposable {  // RxTarget 是 Rxswift 源码
        private var retainSelf: RxTarget?
        override init() {
            super.init()
            self.retainSelf = self
        }
        func dispose() {
            self.retainSelf = nil
        }
    }
    
    final class RefreshTarget<Component:MJRefreshComponent>: RxTarget {
        typealias Callback = MJRefreshComponentRefreshingBlock
        var callback: Callback?
        weak var component:Component?
    
        let selector = #selector(RefreshTarget.eventHandler)
    
        init(_ component: Component,callback:@escaping Callback) {
            self.callback = callback
            self.component = component
            super.init()
            component.setRefreshingTarget(self, refreshingAction: selector)
        }
        @objc func eventHandler() {
            if let callback = self.callback {
                callback()
            }
        }
        override func dispose() {
            super.dispose()
            self.component?.refreshingBlock = nil
            self.callback = nil
        }
    }
    
    extension Reactive where Base: MJRefreshComponent {
        var event: ControlEvent<Base> {
            let source: Observable<Base> = Observable.create { [weak control = self.base] observer  in
                MainScheduler.ensureExecutingOnScheduler()
                guard let control = control else {
                    observer.on(.completed)
                    return Disposables.create()
                }
                let observer = RefreshTarget(control) {
                    observer.on(.next(control))
                }
                return observer
            }.takeUntil(deallocated)
            return ControlEvent(events: source)
        }
    }

    怎么使用呢? 

     collectionView.mj_header.rx.event
                .map { _ in Reactor.Action.refresh }
                .bind(to: reactor.action)
                .disposed(by: disposeBag)
            
     collectionView.mj_footer.rx.event
                .map { _ in Reactor.Action.loadMore }
                .bind(to: reactor.action)
                .disposed(by: disposeBag)

    更多内容,请到我的 gitpage

  • 相关阅读:
    mysql 修改字符集
    django 详细实例教程
    mysql 创建数据库
    Django 初始化数据库
    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
    2019 Multi-University Training Contest 1 D.Vacation(思维)
    2019牛客暑期多校训练营(第五场)E.independent set 1(状压dp)
    2019牛客暑期多校训练营(第三场)A.Graph Games (分块)
    2019牛客暑期多校训练营(第五场)I.three points 1(暴力几何)
    2019牛客暑期多校训练营(第五场)H.subsequence 2(拓扑)
  • 原文地址:https://www.cnblogs.com/Ohero/p/7783995.html
Copyright © 2020-2023  润新知