RxSwift - ReactiveX for Swift
RxSwift的核心角色
Observable:负责发送事件(Event)
Observer:负责订阅Obserable,监听Observable发送的事件
截屏2022-03-11 下午7.25.41.png示例 - 创建、订阅Observable
let ob = Observable<Int>.create { ob in
ob.onNext(11)
ob.onCompleted()
return Disposables.create()
}
这是创建了一个obserable
ob.subscribe { event in
switch event {
case .next(let element):
print("next",element) // next 11
case .completed:
print("completed") // completed
case .error(let error):
print("error",error)
}
}
ob.subscribe { element in
print("next2",element) // next2 11
} onError: { Error in
print("error",Error)
} onCompleted: {
} onDisposed: {
}
上一段代码是订阅了ob这个对象,ob这个对象发出了onNext(11)和onCompleted(),所以订阅者收到了发出的信号,打印出了next 11,completed
再介绍几种创建observable的方法
var ob1 = Observable.just(13)
var ob2 = Observable.of(14)
var ob3 = Observable.from(optional: 15)
这几种都可以创建observable
timer
let ob4 = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
ob4.subscribe { Event in
print(Event)
}
next(0)
next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
next(7)
第一个参数的意思是,2秒之后执行,第二个参数是每秒执行一次,第三个参数是在主线程里操作
示例
let ob4 = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
ob4.subscribe { Event in
print(Event)
}
var la = UILabel.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
la.text = "test"
la.textColor = UIColor.red
self.view.addSubview(la)
ob4.map { index in
"\(index)"
}.bind(to: la.rx.text)
上述代码,演示了定时器刷新lable的的功能,因为obserable是Int类型,所以不能直接绑定到lable里面去,需要我们使用map转成String类型
Disposable
每当Obserable被订阅时,都会返回一个Disposable实例,当调用Disposable的dispose,就相当于取消订阅了
let dispose = ob1.subscribe { event in
print(event) // next(13)
}
dispose.dispose()
可以在需要的时候调用dispose(),这样就不会再收到信号了
ob1.subscribe { event in
print(event) // next(13)
}.dispose()
这种写法表示一旦收到订阅的消息,就只会执行一次,以后不会再接收订阅
let bag = DisposeBag()
ob1.subscribe { event in
print(event) // next(13)
}.disposed(by: bag)
ob2.subscribe { event in
print(event) // next(14)
}.disposed(by: bag)
ob3.subscribe { Event in
print(Event) // next(15)
}.disposed(by: bag)
这种销毁机制,相当于把ob1,ob2,ob3,都放入了一个袋子,bag这个袋子,那这个袋子什么时候销毁,取决于控制器什么时候执行deinit,就会跟随着控制器一起取消了订阅
ob3.takeUntil(self.rx.deallocated).subscribe { Event in
print(Event)
}
takeUntil表示什么时候执行dispose()这个方法,self.rx.deallocated表示在控制器消亡的时候,就会取消订阅
创建Obserable
var label = UILabel.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
label.text = "test"
label.textColor = UIColor.red
self.view.addSubview(label)
let binder = Binder<String>(label) { label, value in
label.text = value
}
Observable.just(1).map({ Index in
"test:\(Index)"
}).subscribe(binder).dispose()
Observable.just(1).map({ Index in
"test:\(Index)"
}).subscribe(binder).dispose()
Observable.just(1).map { index in
"数值2:\(index)"
}.bind(to: binder).dispose()
这两种写法是一样的
示例
需求:放置一个按钮,按钮每个一秒消失,每隔一秒显示
let obserable = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
// 首先创建obserable,定时器
var button = UIButton.init(frame: CGRect(x: 100, y: 200, width: 100, height: 100)) // 放置按钮
button .setTitle("按钮", for: .normal)
button.backgroundColor = .red
self.view.addSubview(button)
let buttonBinder = Binder<Bool>(button) {button,value in
button.isHidden = value
}
// 定义observe,监听器,由于是需要显示与消失,我们定义bool类型,绑定的对象是button
obserable.map { index in
index % 2 == 0
}.bind(to: buttonBinder).disposed(by: bag)
// obserable发送的是Int类型,我们要转成bool类型,用index%2==0的返回值就是bool类型,来确定button的显示与消失,至于什么时候disposed,我们定义了一个bag,当控制器消失的时候,bag也会随之消失
网友评论