当前位置: 首页 > news >正文

上海展览设计制作公司/优化设计电子课本下载

上海展览设计制作公司,优化设计电子课本下载,工作服厂家无锡 帛裳服饰专业,流量卡推广方法Time Operators RxSwift 提供了一系列的操作符允许我们处理时间。Buffer 工作原理:周期性的收集被观察者序列发送的元素,并存储到缓存区,最后发送集合而不是单独的元素.将一个Observable序列投影到一个缓存池,当缓存池达到最大数量…

Time Operators

RxSwift 提供了一系列的操作符允许我们处理时间。

Buffer

工作原理:周期性的收集被观察者序列发送的元素,并存储到缓存区,最后发送集合而不是单独的元素.
将一个Observable序列投影到一个缓存池,当缓存池达到最大数量或者超过指定时间时,buffer将作为一个事件被发出,注意timer运行在指定的调度器上,它的功能是周期性地收集事件然后打包发出,而不是每一个事件单独发出。Buffer操作符将一个Observable变换成了一个发送Buffer包事件的Observable序列,依据如何将源Observable事件进行打包到buffer的策略有很多Buffer操作符的变形。

 public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)-> Observable<[E]> {return BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)}
方法中:第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。总体来说就是经过一定时间,将一定个数的事件组合成一个数组,一起处理,在组合的过程中,你可以选择自己的线程。

注意:当源Observable发出一个onError事件通知,Buffer不会进行继续打包而是直接将OnError通知发出


        let disposeBag = DisposeBag()//1let buffer = PublishSubject<String>()//2buffer.buffer(timeSpan: 2, count: 3, scheduler: MainScheduler.instance).subscribe { print("subscribe1 : \($0)")}.addDisposableTo(disposeBag)buffer.buffer(timeSpan: 1, count: 2, scheduler: MainScheduler.instance).subscribe { print("subscribe2 : \($0)")}.addDisposableTo(disposeBag)//3buffer.onNext("1")buffer.onNext("2")buffer.onNext("3")buffer.onNext("4")buffer.onNext("5")buffer.onNext("6")//4RunLoop.main.run(until: Date(timeIntervalSinceNow: 2))
 执行结果和分析:
         subscribe2 : next(["1", "2"])
         subscribe1 : next(["1", "2", "3"])
         subscribe2 : next(["3", "4"])
         subscribe1 : next(["4", "5", "6"])
         subscribe2 : next(["5", "6"])
         subscribe2 : next([])
         subscribe1 : next([])
        
1:创建一个PublishSubject对象
2:添加两个订阅者,并且都使用了buffer操作符,subscribe1是指定了以3个为一组进行发送,并且缓冲时间为2秒,在主线程运行。subscribe2指定了2个事件为一组,缓冲时间为1秒,同样运行在主线程
3:接下来发送6个事件
4:保持主线程运行2秒
   
由结果可知,当我们开始发送事件,订阅者会开始接受事件,随着不断的发送事件,首先subscribe2当缓存了2个事件之后,立马会发送该集合事件并继续下一次缓存。我们可以看到先打印了subscribe2 : next(["1", "2"])结果。当subscribe1缓存了3个事件之后会立马发送集合事件,所以会打印subscribe1 : next(["1", "2", "3"])。每次发送结束,订阅者会继续等待事件,并再一次缓存事件。由于我们发送了6次事件消息,所以每次到了指定的缓存个数就会发送事件。最后打印了两个空的集合事件,是因为我们保证了程序会运行2秒,在subscribe1发送完了所有的事件之后,当指定的时间到了,所以发送一个空事件。subscribe2也是一样,在2秒的时候由于没有接受事件,所以发送空事件。(注意:之所以会有后面的空集合事件,是因为之前发送事件的总时间小于我们指定的时间)

Window

跟buffer(timeSpan:count:scheduler:)非常相像,那就是window(timeSpan:count:scheduler:)。参数一样,几乎做一样的事情。唯一的区别就是它发送观察者序列作为缓冲的元素而不是发送一个集合。需要特别注意的是window方法之后,返回的是Observable

public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) -> RxSwift.Observable<RxSwift.Observable<Self.E>>

        let disposeBag = DisposeBag()let buffer = PublishSubject<String>()buffer.window(timeSpan: 2, count: 3, scheduler: MainScheduler.instance).subscribe(onNext: { [weak self]  inprint("subscribe: \($0)")self?.subscribeobservable($0)}).addDisposableTo(disposeBag)buffer.onNext("1")buffer.onNext("2")buffer.onNext("3")
subscribeobservable函数

 func subscribeobservable(_ observable: Observable<String>) {observable.subscribe(onNext: {print("value: \($0)")}).addDisposableTo(disposeBag)}
执行结果:
subscribe: RxSwift.AddRef<Swift.String>
value: 1
value: 2
value: 3
subscribe: RxSwift.AddRef<Swift.String>

Delay

/**Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.- parameter dueTime: Relative time shift of the source by.- parameter scheduler: Scheduler to run the subscription delay timer on.- returns: the source Observable shifted in time by the specified delay.*/public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> RxSwift.Observable<Self.E>
RxSwift中有一种类型的延迟,那就是延迟整个观察者序列(the whole sequence),并不是订阅晚了,而是在订阅源观察者序列之后,根据具体的时间延迟每一个元素的发送.

        let disposeBag = DisposeBag()Observable<Int>.interval(1, scheduler: MainScheduler.instance).delay(2, scheduler: MainScheduler.instance).subscribe(onNext: { print($0)}).addDisposableTo(disposeBag)RunLoop.main.run(until: Date(timeIntervalSinceNow: 6))
执行结果:
0
1
2
3


delaySubscription

该操作符是延迟订阅,跟名字显示的意思一样。

 /**Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers. - parameter dueTime: Relative time shift of the subscription.- parameter scheduler: Scheduler to run the subscription delay timer on.- returns: Time-shifted sequence.*/public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> RxSwift.Observable<Self.E>

注意:在Rx中,有一些观察者序列(observables)被称为“cold”,其它的称为“hot”。cold的观察者序列开始发送元素是当你订阅(subscribe)它们之后。而hot观察者序列更像是永远的源,并监听着你的变化。当使用延迟订阅,它对于cold的观察者序列并没有什么变化。但是如果是hot,可能会跳过一些元素。

interval

定时器(Timer)是任意类型应用中一种普遍的需求,iOS和macOS中都有一些定时处理方法。RxSwift中提供了一种非常简单有效的方法来处理定时,那就是Interval。前面我们已经使用过了。
interval(_:scheduler:) 该操作符将产生一个无限观察者序列,在指定了interval运行的具体线程,在指定时间之后,发送Int类型的值,从0开始。

 let disposeBag = DisposeBag()Observable<Int>.interval(1, scheduler: MainScheduler.instance).subscribe(onNext: { print($0)}).addDisposableTo(disposeBag)
执行结果:
0
1
2
3
4
… 一直执行下去

Timers

  /**Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.- parameter dueTime: Relative time at which to produce the first value.- parameter period: Period to produce subsequent values.- parameter scheduler: Scheduler to run timers on.- returns: An observable sequence that produces a value after due time has elapsed and then each period.*/public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType) -> Observable<E> 
timer操作符是非常像interval,但是有以下特征:
1: 在订阅开始和发送第一个元素值之间,你能够指定一个到期日期的时间。
2: 重复周期是可选操作,如果你并没有指定一个,那么定时器观察者序列将发送一次,之后发送完成消息事件。如果指定了周期性的次数,那么将在每次指定时间到了之后,执行一次发送事件。

Observable<Int>.timer(2, scheduler: MainScheduler.instance).subscribe(onNext: { print($0) })
执行结果:
0
因为没有周期性参数,所以在指定到期时间到了之后,会发送一个事件。如果我们指定周期性间隔,那么会按指定的周期间隔发送值。下面指定了每间隔3秒发送一次事件

 Observable<Int>.timer(1, period: 3, scheduler: MainScheduler.instance).subscribe(onNext: { print($0) })

执行结果:

0

1

2

3

4

5

... 






http://www.lbrq.cn/news/802171.html

相关文章:

  • 网站框架怎么做/深圳全网推互联科技有限公司
  • 论坛网站建设模板/竞猜世界杯
  • 淮安新网站制作/重庆百度推广开户
  • 做网站如何避免侵权/武汉好的seo优化网
  • 网站建设 艺麟盛世/中国职业技能培训中心官网
  • 同一个wifi下_我如何用手机访问我用我电脑做服务器的网站/站长工具的网址
  • 如何制作app软件演示教程/seo运营是做什么的
  • 邵阳高端网站建设/湖南网站推广优化
  • wordpress redis 刷新/青岛seo
  • 如何找网站做推广/百度竞价系统
  • 免费网站制作/推广链接
  • 扁平化 公司网站/南京seo公司教程
  • 织梦响应式网站怎么做/郑州seo推广
  • 网站建设百度百科/杭州网站优化公司
  • 海南响应式网站建设方案/站长工具权重查询
  • 制作网站网页/网站收录是什么意思
  • 个人备案网站可以做电影站吗/百度官方推广平台
  • 网站建设 排名宝下拉/西安专业做网站公司
  • 手机网站建设软件有哪些方面/制作网站平台
  • 网站开发论文主要内容/在线子域名二级域名查询工具
  • 潍坊网站建设SEO优化/今日国际新闻摘抄
  • 微网站方案怎么写/百度seo推广软件
  • 欧米茄女士手表网站/免费个人网页制作
  • 高清做视频在线观看网站/参考消息网国内新闻
  • 个人网站怎么做qq客服/百度搜索推广收费标准
  • 好一点的网站建设/最新发布的最新
  • 网站seo重庆/宁波seo公司网站推广
  • 自建商城网站/成都网站seo
  • 什么网站有题目做/百度seo软件是做什么的
  • c 做网站好嘛/如何建立和设计公司网站
  • web:js的模块导出/导入
  • 【机器学习】“回归“算法模型的三个评估指标:MAE(衡量预测准确性)、MSE(放大大误差)、R²(说明模型解释能力)
  • Rockchip RK3568J +FPGA边缘智能系统及储能网关
  • Go语言常用的设计模式
  • Cesium 快速入门(一)快速搭建项目
  • Java试题-选择题(2)