RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder
let disposeBg = DisposeBag()
//直接在创建
//在 subscribe 方法中创建
let ofObserval = Observable.of("a","b","c")
ofObserval.subscribe(onNext: { (element) in
print(element)
}, onError: { (error) in
print(error.localizedDescription)
}, onCompleted: {
print("完成")
}) {
print("取消")
}.disposed(by: disposeBg) let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//在 bind 方法中创建
schedulerObserval
.map {
"当前索引:\($0)" //返回字符串
}
.bind {(value) in
//action
print(value)
}
.disposed(by: disposeBg)
//写在appdelegate里不执行,写在VC里正常??? //AnyObserver 可以用来描叙任意一种观察者。
//配合 subscribe 方法使用
let anyObserval:AnyObserver<String> = AnyObserver{ event in
switch event{
case .next(let data):
//action
print(data)
case .error(let error):
print(error)
case .completed:
print("完成")
}
}
// let anyOB = ofObserval.subscribe(anyObserval)
// print(anyOB) //配合 bindTo 方法使用
schedulerObserval
.map{"点前索引\($0)"}
.bind(to: anyObserval)
.disposed(by:disposeBg) /*===> 写在appdelegate里不执行,写在VC里正常???
当前索引:0
当前索引:1
当前索引:2
当前索引:3
当前索引:4
当前索引:5
当前索引:6
当前索引:7
当前索引:8
当前索引:9
当前索引:10
*/
@IBOutlet weak var label: UILabel!
@IBOutlet weak var mbutton: UIButton! let disposeBag = DisposeBag() //上面序列数显示样例中,label 标签的文字显示就是一个典型的 UI 观察者。
//它在响应事件时,只会处理 next 事件,而且更新 UI 的操作需要在主线程上执行。
//那么这种情况下更好的方案就是使用 Binder。
let blinderObserval:Binder<String> = Binder(label){view,text in
view.text = text
} //Observable序列(每隔1秒钟发出一个索引数)
let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) scheduleObservable
.map{"当前索引\($0)"}
.bind(to: blinderObserval)
.disposed(by: disposeBag) scheduleObservable
.map {$0 % 2 == 0}
.bind(to: mbutton.rx.isEnabled)
.disposed(by: disposeBag) //Binder 在 RxCocoa 中的应用
let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
//在 bind 方法中创建
schedulerObserval
.map {
"当前索引:\($0)" //返回字符串
}
.bind {(value) in
//action
print(value)
}
.disposed(by: disposeBag)
补充知识:
//Swift==>map
let array = [1,2,3,4,5] let mapArray = array.map { (value) -> Int in
return value + 2
}
print(mapArray)
//===>[3, 4, 5, 6, 7] let mapArray1 = array.map{
return $0*2
}
print(mapArray1)
//===>[2, 4, 6, 8, 10] func arrayCount(int:Int) -> Int{
return int*3
}
let mapArray0 = array.map(arrayCount)
print(mapArray0)
//===>[3, 6, 9, 12, 15] /*
2 flatMap与map不同之处:
(1)flatMap返回后的数组中不存在nil,同时它会把Optional解包
(2)flatMap还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组
*/
//Swift==>flatMap
let mapArr = array.map { (int) -> String? in
let ms = "\(int)"
return ms
}
print(mapArr)
//===>[Optional("1"), Optional("2"), Optional("3"), Optional("4"), Optional("5")] //flatMap' is deprecated: Please use compactMap(_:)
//for the case where closure returns an optional value Use 'compactMap(_:)' instead
let mapArr1 = array.compactMap { (int) -> String? in
let ms = "\(int)"
return ms
}
print(mapArr1)
//===>["1", "2", "3", "4", "5"] let testArray = [[1,2,3],[4,5,6],[7,8,9]]
let mapArray3 = testArray.map{$0}
print(mapArray3)
//===>[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let mapArray4 = testArray.flatMap{$0}
print(mapArray4)
//===>[1, 2, 3, 4, 5, 6, 7, 8, 9]
RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder的更多相关文章
- RxSwift学习笔记5:Binder
使用 Binder 创建观察者 //Observable序列(每隔1秒钟发出一个索引数) let scheduleObservable = Observable<Int>.interval ...
- RxSwift学习笔记7:buffer/window/map/flatMap/flatMapLatest/flatMapFirst/concatMap/scan/groupBy
1.buffer的基本使用 let publishSubject = PublishSubject<String>() //buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参 ...
- 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学习笔记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学习笔记6:Subjects/PublishSubject/BehaviorSubject/ReplaySubject/Variable
// 从前面的几篇文章可以发现,当我们创建一个 Observable 的时候就要预先将要发出的数据都准备好,等到有人订阅它时再将数据通过 Event 发出去. // 但有时我们希望 Observabl ...
- RxSwift学习笔记3:生命周期/订阅
有了 Observable,我们还要使用 subscribe() 方法来订阅它,接收它发出的 Event. let observal = Observable.of("a",&qu ...
随机推荐
- Android.ApplicationCrash
1. 如何调试分析Android中发生的tombstone http://www.360doc.com/content/12/1017/10/7580194_241974419.shtml tombs ...
- Next generation sequencing (NGS)二代测序数据预处理与分析
二代测序原理: 1.DNA待测文库构建. 超声波把DNA打断成小片段,一般200--500bp,两端加上不同的接头2.Flowcell.一个flowcell,8个channel,很多接头3.桥式PCR ...
- NETSHARP微信开发说明
一.微信开发介绍 1.微信分为个人号,订阅号.服务号,需要去理解三个号的区别,对于开发来说也需要了解不同的账号所提供的功能 2.微信号需要审批,审批之后有一些功能才能使用 3.微信提供的功能及使用情况 ...
- java面试感悟【一】
我最终选择不包装工作经验,或许是因为我怂,或许是因为一些莫名其妙的坚持…… 然而结果就是在boss上沟通了20多家,只有7家让我投了简历,1家跟我说要我发个时间段给他稍后告诉我面试时间,然后就没有然后 ...
- DB2序列和主键自增长
1.把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id int a ...
- Windows8 App Store 开发者会关心的文档
在远程计算机上从 Visual Studio 调试和测试 Windows 应用商店应用程序 http://msdn.microsoft.com/zh-cn/library/windows/apps/h ...
- 【转】centos7 搭建etcd集群
转自http://www.cnblogs.com/zhenyuyaodidiao/p/6237019.html 一.简介 “A highly-available key value store for ...
- iOS后台唤醒实战:微信收款到账语音提醒技术总结
1.前言 微信为了解决小商户老板们在频繁交易中不方便核对.确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能.本文借此总结了iOS平台上的APP后台唤醒和语音合成.播放等一系列技术开 ...
- 2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)
传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> ...
- (6)How language shapes the way we think
https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think/transcript 00:12So, I ...