RxSwift学习笔记5:Binder
使用 Binder 创建观察者
//Observable序列(每隔1秒钟发出一个索引数)
let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) let blinderObserval:Binder<String> = Binder(label){view,text in
view.text = text
} scheduleObservable
.map{"当前索引\($0)"}
.bind(to: blinderObserval)
.disposed(by: disposeBag)
自定义可绑定属性
//有时我们想让 UI 控件创建出来后默认就有一些观察者,而不必每次都为它们单独去创建观察者。
//比如我们想要让所有的 UIlabel 都有个 fontSize 可绑定属性,它会根据事件值自动改变标签的字体大小。 //这里我们通过对 UILabel 进行扩展,增加了一个 fontSize 可绑定属性。
extension UILabel{
public var fontSize:Binder<CGFloat>{
return Binder(self){label,fontSize in
label.font = UIFont.systemFont(ofSize: fontSize)
}
}
}
//通过对 Reactive 类进行扩展
extension Reactive where Base:UILabel{
public var fontSize:Binder<CGFloat>{
return Binder(self.base){label,fontSize in
label.font = UIFont.systemFont(ofSize: fontSize)
}
}
}
//Observable序列(每隔1秒钟发出一个索引数)
let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) /*
有时我们想让 UI 控件创建出来后默认就有一些观察者,而不必每次都为它们单独去创建观察者。
比如我们想要让所有的 UIlabel 都有个 fontSize 可绑定属性,它会根据事件值自动改变标签的字体大小。
*/ scheduleObservable
.map{ CGFloat($0) }
.bind(to: label.fontSize)
.disposed(by:disposeBag) scheduleObservable.map{CGFloat($0)}
.bind(to: label.rx.fontSize)
.disposed(by: disposeBag)
RxSwift 自带的可绑定属性(UI 观察者)
override func viewDidLoad() {
super.viewDidLoad()
//Observable序列(每隔1秒钟发出一个索引数)
let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
/*
//其实 RxSwift 已经为我们提供许多常用的可绑定属性。比如 UILabel 就有 text 和 attributedText 这两个可绑定属性。
import RxSwift
import UIKit
extension Reactive where Base: UILabel {
/// Bindable sink for `text` property.
public var text: Binder<String?> {
return Binder(self.base) { label, text in
label.text = text
}
}
/// Bindable sink for `attributedText` property.
public var attributedText: Binder<NSAttributedString?> {
return Binder(self.base) { label, text in
label.attributedText = text
}
}
}
*/
//RxSwift 自带的可绑定属性(UI 观察者)
scheduleObservable
.map{"当前索引\($0)"}
.bind(to: label.rx.text)
.disposed(by: disposeBag)
scheduleObservable
.map {$0 % 2 == 0}
.bind(to: mbutton.rx.isEnabled)
.disposed(by: disposeBag)
}
Binder 在 RxCocoa 中的应用
//其实 RxCocoa 在对许多 UI 控件进行扩展时,就利用 Binder 将控件属性变成观查者
//比如 UIControl+Rx.swift 中的 isEnabled 属性便是一个 observer :
let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//在 bind 方法中创建
schedulerObserval
.map {
"当前索引:\($0)" //返回字符串
}
.bind {(value) in
//action print(value)
}
.disposed(by: disposeBag)
RxSwift学习笔记5:Binder的更多相关文章
- RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder
let disposeBg = DisposeBag() //直接在创建 //在 subscribe 方法中创建 let ofObserval = Observable.of("a" ...
- RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy
1.buffer的基本使用 let publishSubject = PublishSubject<String>() //buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参 ...
- RxSwift学习笔记2:Observable/生命周期/Event/oneNext/onError/onCompleted/
Observable 是 Rx 的根基 官网:http://reactivex.io/ github地址:https://github.com/ReactiveX/RxSwift Observabl ...
- RxSwift学习笔记1:RxSwift的编程风格
第一天:简单体验与RxSwift的编程风格 import UIKit//导入Rx相关框架 import RxSwift import RxCocoa struct Music { let name:S ...
- RxSwift学习笔记10:startWith/merge/zip/combineLatest/withLatestFrom/switchLatest
//startWith //该方法会在 Observable 序列开始之前插入一些事件元素.即发出事件消息之前,会先发出这些预先插入的事件消息 Observable.of(1,2,3) .startW ...
- RxSwift学习笔记9:amb/tabkeWhile/tabkeUntil/skipWhile/skipUntil
//amb基本介绍 //当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素. //并忽略掉其他的 Observable ...
- RxSwift学习笔记8:filter/distinctUntilChanged/single/elementAt/ignoreElements/take/takeLast/skip/sample/debounce
//filter:该操作符就是用来过滤掉某些不符合要求的事件. Observable.of(1,2,3,4,5,8).filter({ $0 % 2 == 0 }).subscribe { (even ...
- RxSwift学习笔记6:Subjects/PublishSubject/BehaviorSubject/ReplaySubject/Variable
// 从前面的几篇文章可以发现,当我们创建一个 Observable 的时候就要预先将要发出的数据都准备好,等到有人订阅它时再将数据通过 Event 发出去. // 但有时我们希望 Observabl ...
- RxSwift学习笔记3:生命周期/订阅
有了 Observable,我们还要使用 subscribe() 方法来订阅它,接收它发出的 Event. let observal = Observable.of("a",&qu ...
随机推荐
- 简单使用DESeq2/EdgeR做差异分析
简单使用DESeq2/EdgeR做差异分析 Posted: 五月 07, 2017 Under: Transcriptomics By Kai no Comments DESeq2和EdgeR都 ...
- 编译https://github.com/CIR-KIT/steer_drive_ros时出现的问题
解决gazebo对应的protobuf版本问题: I've come across to the same problem. I'm using Ubuntu 16.04, ROS Kinetic a ...
- Mercurial和Git的主要区别(zz)
Mercurial和Git的主要区别 17 August 2008 1.Mercurial用Python开发,Git用C开发,相对来说,Git比较快,但是Mercurial的性能也不差 2.Mercu ...
- codeforces C. Functions again
题意:给定了一个公式,让你找到一对(l,r),求解出公式给定的F值. 当时没有想到,我把(-1)^(i-l)看成(-1)^i,然后思路就完全错了.其实这道题是个简单的dp+最长连续子序列. O(n)求 ...
- AOP的异常通知
一.配置异常通知的步骤 (Aspectj方式) 1.只有当切点报异常才能触发异常通知 2.在spring中有Aspectj 方式提供了异常通知方法 2.1 如果希望通过 schema-base 实 ...
- 43.Charles抓包(iOS的http/https请求)
Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 官网下载安装Charles: https://www.charlesproxy.com/download/ 2. H ...
- Servlet WebSocket的简易聊天室
添加依赖 <!-- websocket --> <dependency> <groupId>javax.websocket</groupId> < ...
- Java基础之多线程没那么复杂!
多线程的引入 1.什么是多线程 线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程序的效率</br> 2.进程和线程之间的关系 操作系统可以同时执行多个任务,每 ...
- 一类n阶微分方程转1阶微分方程组
- oracle在exp导出时报错PLS-00201: identifier 'EXFSYS.DBMS_EXPFIL_DEPASEXP' must be declared
报错如下信息: EXP-00008: ORACLE error 6550 encounteredORA-06550: line 1, column 14:PLS-00201: identifier ' ...