持续创作,加速生长!这是我参与「日新计划 6 月更文应战」的第2天,点击检查活动详情
前语
今天又来撸RXSwift功用了!
说起倒计时按钮这个功用我们应该都不陌生,在iOS中,有许多办法能够去完结,比如GCD,NSTimer等,按运用状况来说,GCD仍是进场时机比较多,终究代码量少。
今天要说的主角并不是GCD,而是用RXSwift去完结这个功用。
正赶上公司需求,就顺便用RXSwift去完结一下,看看它到底好不好用。
先声明 我们运用的版别是
pod 'RxSwift', '~> 5.0'
pod 'RxCocoa', '~> 5.0'
版别比较新,对应从前的版别,RXSwift有语法上的改动,留意
正文
第一步:我们先定义一个timer
let timer = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
在这里先说明一下,我参阅过其他人的写法,许多人写守时器的时分简略把 Observable<Int>.interval
和 Observable<Int>.timer
弄错,这里说明一下
interval:每隔一段时间,宣告一个索引数,将宣告无数个
timer:在一段延时后,每隔一段时间发生一个元素
假如不是需求延时操作,我们就挑选interval
。
然后第一个参数 RxTimeInterval.seconds(1)
表示的是距离1秒,在老版别中,这个参数能够直接填1
或许 DispatchTimeInterval.seconds(1)
但是在新的版别中,这么天会有警告,仍是改成最新的写法把。
第二个参数 MainScheduler.instance
,这里说明一下
MainScheduler
其实是对DispatchQueue.main
的封装。供应了一些访问办法,包含init
、instance(同步)
、asyncInstance(异步)
等,在这里,守时器需求传入在那个线程上,所以我们挑选MainScheduler.instance
。
第二步:声明两个BehaviorRelay
private let countDownSeconds: Int = 60
let countDownStopped = BehaviorRelay(value: true)
let leftTime = BehaviorRelay(value: countDownSeconds)
countDownStopped
和leftTime
了解起来不必太凌乱,就恰当与定义了个变量,countDownStopped
是初始值为true
的BOOL类型,leftTime
是初始值为60的Int类型。
别问我为什么要这么做,因为装逼因为帅…..
ps : 在从前的版别里 许多都用的不是BehaviorRelay
而是 Variable
,官方说了,以后都不会支撑 Variable
,所以用新的不会错。至于为什么,请参阅
第三步:关键代码
func countdownTime(){
// 开端倒计时
self.countDownStopped.accept(false)
timer.takeUntil(countDownStopped.asObservable().filter{$0})
.observeOn(MainScheduler.asyncInstance)
.subscribe(onNext: { [weak self](event) in
self!.leftTime.accept(self!.leftTime.value - 1)
/// UI操作
if (self!.leftTime.value == 0) {
print("倒计时完毕")
self!.countDownStopped.accept(true)
self!.leftTime.accept(countDownSeconds)
/// UI操作
}
}, onError: nil )
.disposed(by: disposeBag)
}
当我们点击履行countdownTime
时,先修正 countDownStopped
为false,然后开端倒计时。
说明:
takeUntil(countDownStopped.asObservable().filter{$0})
就是有一个东西调查timer
的时分同时调查countDownStopped
的值,当countDownStopped
的值改动时,就中止timer
(要点!!多读几遍)
说明:.observeOn(MainScheduler.asyncInstance)
observeOn
来决定在主线程异步(MainScheduler.asyncInstance
)监听这个数据序列
接下来看每次守时器改动时的操作
self!.leftTime.accept(self!.leftTime.value - 1)
守时器每次改动时,将leftTime
进行 -1操作
if (self!.leftTime.value == 0)
当leftTime
为0时,
self!.countDownStopped.accept(true)
将countDownStopped
变为true
self!.leftTime.accept(countDownSeconds)
同时将leftTime
变为60
这样就完结了一个根本的守时操作
怎样随时中止呢?
只需履行 countDownStopped.accept(true)
就行,这时守时器就不会持续走了。
结语
至此,倒计时功用就完结了,说实话,学习本钱比GCD高上不少,因为网上的文档不是太全,并且RXSwift的运用函数又许多,所以很简略蒙圈。我觉得在学习量比较多的状况下,最好是能自己构成一个套路,封装成代码块,这样就很方便了。