RxSwift防止服务器频繁调用的利器throttle控制时间间隔的教程和demo代码下载

54 篇文章 1 订阅
6 篇文章 0 订阅

前言

记得以前看过一篇文章,写了又臭又长一大堆代码,目的就是为了直播的时候发送礼物,屏幕礼物连续显示,但是发送给服务器的时候要几秒钟发送一次,把累计的发送礼物发送过去.代码我已经记不住了,太麻烦了,今天的throttle方法可以轻松解决这个问题.
今天的用这个方法做了2个实战的例子:

实战例子

1.频繁点击发送礼物按钮,屏幕立即显示发送礼物,但是发送给服务器是2秒发送一次
2.输入框改变就马上发送数据进行查询,这样会频繁调用服务器,改成输入框输入以后每个2秒查询一次服务器

throttle方法的语法讲解

throttle 在指定的时间内,只接受一条数据,和最后一条数据.最后一条数据的意思就是说,如果每个5秒接收一次数据,那么我这5秒里面前3秒最后一次发送的数据也会接收到,这样就不会丢失数据.下面举例 说明

例子1:模拟直播发送礼物

var sub1 = PublishSubject<String>() //类成员变量里面定义序列
let disposeBag = DisposeBag() //释放用的垃圾袋
override func viewDidLoad() {
        super.viewDidLoad()
        //throttle 在指定的时间内,只接受第一条和最新的数据
        //下面代码 1500毫秒接受一条最新数据  ,MainScheduler.instance 是在主线程中执行操作
        sub1.throttle(RxTimeInterval.milliseconds(1500), scheduler: MainScheduler.instance)//1500毫秒接受一次
            .subscribe(onNext: { value in
               print("订阅到",value)
            })
            .disposed(by: disposeBag)
    }

发送礼物点击按钮的代码

   @IBAction func btn1Click(_ sender: Any) {
        label.text = "发送礼物\(tapConut)个"   //用户看的界面显示实时礼物发送个数
        tapConut += 1
        sub1.onNext("服务器接收到发送礼物\(tapConut)个")
    }

上面的代码,按钮在被用户连续点击的时候界面是连续显示变化的,但是sub1被throttle限制以后,就变成1500毫秒接受一次,再被subscribe订阅就1500毫秒打印一次,这里把打印改成向服务器发送的代码就完成了直播间发送礼物但是1500毫秒发送一次网络请求的功能
运行效果如下:注意看下面打印的内容是模拟向服务器发送请求的
在这里插入图片描述

例子2.模拟输入框改变就查询服务器获取最新数据

输入框改变就马上发送数据进行查询,这样会频繁调用服务器,改成输入框输入以后每个2秒查询一次服务器
skip(2)是跳过前2次不用的数据,进入控制器以后会有2次空白的数据

    @IBOutlet weak var tf: UITextField!
    override func viewDidLoad() {
    super.viewDidLoad()
    //skip(2)是跳过前2次不用的数据,进入控制器以后会有2次空白的数据
    tf.rx.text.orEmpty.skip(2).throttle(RxTimeInterval.seconds(2), scheduler: MainScheduler.instance)
        .subscribe(onNext: { value in
            print("向服务器发送数据value=",value)
        })
        .disposed(by: disposeBag)
}

看下执行结果gif:
在这里插入图片描述

demo下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值