美文网首页函数式思维
RxSwift 对 MJRefresh 的封装

RxSwift 对 MJRefresh 的封装

作者: OHeroJ | 来源:发表于2017-11-04 17:53 被阅读18次

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

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

Rxswift 中的很多类似处理的方式都使用了跟下面极为相似的代码,进行针对 UIControl 类似的的适配时,是通过一个中间层 ControlTarget, 或者是继承自RxTarget 的子类来完成的,为了保持类似这个 ControlTarget 实例的存活,使得它不会被自动释放,先用一个集合来包裹住它,并将这个集合设置为目标 UIControl 的关联对象。这个 ControlTarget 看做是这个事件流管道中的一个资源来生成 Observable 对象

个人写的代码如下:

import UIKit
import MJRefresh
import RxSwift
import RxCocoa

class RxTarget: NSObject, Disposable {
    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.rx.setDelegate(self).disposed(by: disposeBag)
        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

相关文章

  • RxSwift 对 MJRefresh 的封装

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

  • 2018-05-28

    对MJRefresh.h再次封装,上拉加载更多,下拉刷新 在公司称着没事的时间随便写写,自己对MJRefresh再...

  • RxSwift 深入浅出(七)网络封装

    RxSwift 这个框架看我就够了,这一篇我重点介绍RxSwift对网络层的封装。搞RxSwift,我是认真的 R...

  • MJRefresh和RxSwift

    关于RxSwift   对RxSwift不熟悉的同学可以查看这两篇文档: RxSwift中文文档 Reactive...

  • MJRefresh 封装

    MJRefresh是很好用的一个刷新控件,但是如果在每个ViewController中都加入如下代码 代码复用性不...

  • RxSwift(1)-初识RxSwift

    简介 Rx简介 RxSwift是Rx家族对swift语言的封装。什么是Rx呢?全称是ReactiveX。官方对自己...

  • 简单封装MJRefresh

    #import "MJRefreshNormalHeader.h" @interfaceXHWRefreshNor...

  • OC:封装 MJRefresh

    背景: 为了避免写大量重复代码,故封装了该分类。本次只是封装了 MJRefresh 的常用场景,包括 Header...

  • 【RxSwift系列】RxSwift下基于MJRefresh实现

    之前写过两篇RxSwift在UITableView中使用的文章,一篇是RXSwift在UITableView中的基...

  • RXSwift使用RXDataSource绑定tableView

    前面介绍了RXSwift的简单实用:登陆示例,以及和MJRefresh来实现刷新分页,但是在实际开发中,这往往不够...

网友评论

    本文标题:RxSwift 对 MJRefresh 的封装

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