Swift知识点---RxSwift学习

1. 什么是RxSwift

RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发、维护

RxSwift的目的是:让数据/事件流 和 异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程

RxSwift本质上还是观察者模式,并且是一个响应式的,并且可以序列化

观察者模式

观察者模式包括:KVO、通知等

爸爸妈妈照看观察宝宝
其中,宝贝就是被观察者
爸爸妈妈就是观察者,或者说是订阅者
只要被观察者(宝宝)发出来某些事件,比如哭声、叫声,则被称为事件,通知到订阅者
此时,订阅者就可以做响应的工作

RxSwift做了什么?

RxSwift把我们程序中的每一个操作都看成一个事件
比如一个TextField中的文本改变、一个按钮被点击、一个网络请求结束等
每一个事件源就可以看成一个管道,也就是sequence

比如,TextField,当我们改变里面的文本的时候,这个TextField就会不断的发出事件
从他的sequence中不断流出,我们只需要监听这个sequence,每流出一个事件就做相应的处理

同理,Button也是一个sequence,每点击一次就流出一个事件

理解Observable和Observer

在这里插入图片描述


2. RxSwift简单体验

  • RxSwift监听按钮的点击
  • RxSwift监听UITextField的文字改变
  • RxSwift改变Label中的文字
  • RxSwift监听对象属性改变
  • RxSwift监听UIScrollView的滚动
//导入RxSwift
import RxSwift
import RxCocoa

按钮监听

原始方法:
button.addTarget(self, action: #selector(button1Click), for: .touchUpInside)

使用RxSwift的方法:

self.button.rx.tap.subscribe {
   
    (event: Event<Void>) in
	print(event)
}

上述方法会有一个标黄的警告:Result of call to ‘subscribe’ is unused
修改方法:

private lazy var disposeBag: DisposeBag = DisposeBag()

self.button.rx.tap.subscribe {
    
     (event: Event<Void>) in
      print(event)
}.disposed(by: disposeBag)```

监听UITextField文字的改变

方法一:传统方法

方法二:
self.view.addSubview(self.textField)
self.textField.frame = CGRect(x: 200, y: 300, width: 100, height: 40)
self.textField.rx.text.subscribe {
   
    (event: Event<String?>) in
	print(event.element)//获取信息
}.disposed(by: disposeBag)

这种方法,获取的event有两个Optional包裹着,使用起来不方便

方法三:
self.textField.rx.text.subscribe {
   
    (myString: String?) in
    print(myString)//获取的是Optional类型
} onError: {
   
    error in
    print(error)
} onCompleted: {
   
   
    print("onCompleted")
} onDisposed: {
   
   
    print("onDisposed")
}.disposed(by: disposeBag)

以上可以简化:

self.textField.rx.text.subscribe {
   
    (myString: String?) in
    print(myString)//获取的是Optional类型
}.disposed(by: disposeBag)

监听Label中的文字

UITextField文字输入,然后Label显示输入的文字

方法一:
self.textField.rx.text.subscribe {
   
    (myString: String?) in
    print(myString)
    self.myTitleLabel.text = myString
}.disposed(by: disposeBag)

self.view.addSubview(myTitleLabel)
myTitleLabel.frame = CGRect(x: 100, y: 210, width: 200, height: 40)
方法二:
self.textField.rx.text
    .bind(to: myTitleLabel.rx.text)
    .disposed(by: disposeBag)
    
self.view.addSubview(myTitleLabel)
myTitleLabel.frame = CGRect(x: 100, y: 210, width: 200, height: 40)

RxSwift的KVO

self.view.addSubview(myTitleLabel)
myTitleLabel.frame = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值