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
RxSwift 对 MJRefresh 使用的封装的更多相关文章
- Swift网络封装库Moya中文手册之RxSwift
RxSwift Maya提供了一个可选的MoyaProvider 子类 - RxMoyaProvider.在网络请求完成时,我们不再使用 request() 函数的回调闭包,而是使用 Observab ...
- Swift高仿iOS网易云音乐Moya+RxSwift+Kingfisher+MVC+MVVM
效果 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS Swift云音乐专栏. 目简介 这是一个使用Swift(还有OC版本)语言,从0开发一个iOS平台,接近企业 ...
- mjrefresh源码分析
最近想自己写个下拉刷新的库,但是始终感觉无从下手,想想总是容易的.原理也很简单,真正要下手写的时候,呵呵.不得不说ios封装得很好,网上可以用的成熟的库也很多,也正是因为如此很多开发者也忽略了很多底层 ...
- OC - 31.通过封装的自定义布局快速实现商品展示
概述 实现效果 设计思路 采用MVC架构,即模型—视图-控制器架构 使用MJExtension框架实现字典转模型 使用MJRefresh框架实现上拉和下拉刷新 上拉刷新,加载新的数据 下拉刷新,加载更 ...
- RxSwift 之官方文档
RxSwift 官方文档结构 Introduction: Subjects Transforming Observables Filtering Observables Combining Obser ...
- RxSwift 系列(二) -- Subject
前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其 ...
- 自主学习之RxSwift(二) -----flatMap
最近项目中有这么一个需求,下面是三个网络请求 A.从服务器获取到时间戳(GET 方法,获取 timeLine) B.进行用户头像上传,获得回传的URL(POST方法,参数为 userId, timeL ...
- RxSwift:ReactiveX for Swift 翻译
RxSwift:ReactiveX for Swift 翻译 字数1787 阅读269 评论3 喜欢3 图片发自简书App RxSwift | |-LICENSE.md |-README.md |-R ...
- 大神都在看的RxSwift 的完全入坑手册
大神都在看的RxSwift 的完全入坑手册 2015-09-24 18:25 CallMeWhy callmewhy 字号:T | T 我主要是通过项目里的 Rx.playground 进行学习和了解 ...
随机推荐
- 一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数
js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 Tango<tanwei_yx@126.com> 特性 支持AMD/CMD/Comm ...
- MonoDeveloper 快捷键
注:环境是Unity3D 5.0.2f1自带的MonoDevelop Ctrl+X 剪切功能.另外,光标放在一行的任意位置(不选中任何内容),使用快捷键,将把这一行剪切并删除此行,这个特性非常好用 C ...
- Java IO使用入门
总体结构 IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO:但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream ...
- Python 编程基础之高阶函数篇(一)
高阶函数:能接受函数作为参数的函数. 如: f=abs def add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...
- HDFS概述(6)————用户手册
目的 本文档是使用Hadoop分布式文件系统(HDFS)作为Hadoop集群或独立通用分布式文件系统的一部分的用户的起点.虽然HDFS旨在在许多环境中"正常工作",但HDFS的工作 ...
- spring事务不会进行回滚的情况
if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Excep ...
- snmp之GenericAddress
GenericAddress 注册地址类型,而不是默认的,第一次调用解析(java.lang.String的)方法之前,设置系统属性ADDRESS_TYPES_PROPERTIES. 这个类涉及到了工 ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- vue前端页面跳转参数传递及存储
不同页面间进行参数传递,实现方式有很多种,最简单最直接的方式就是在页面跳转时通过路由传递参数,如下所示. 路由传递参数 this.$router.push({ name: '跳入页面', params ...
- 编译LNMP之nginx+php-fpm
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...