前言
记得以前看过一篇文章,写了又臭又长一大堆代码,目的就是为了直播的时候发送礼物,屏幕礼物连续显示,但是发送给服务器的时候要几秒钟发送一次,把累计的发送礼物发送过去.代码我已经记不住了,太麻烦了,今天的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: