我正在参加「掘金·启航计划」
简介
-
swift------>属于 静态语言
-
OC ------>属于 动态语言
-
RXSwift框架使用函数响应式编程思想,弥补Swift静态语言的不灵活性,使用简单,代码清晰
-
RX 即 ReactiveX--->跨平台框架,
-
RXJs
-
RXJava
-
RXPhyson 等
那么什么是函数响应式编程? 函数可作为 输入的参数 或者返回值
KVO在Swift里使用三步曲:
- 订阅
- 响应
- 移除
//订阅
func setKVOtest(){
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
}
//响应
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print(change as Any)
}
//移除
deinit
{
self.removeObserver(self.person, forKeyPath: "name")
}
注意:
- 被观察的属性需要用 @objc dynamic 修饰,原因是Swift里面KVO 底层使用的还是OC里面的运行时,需要动态实现
RXSwift 将订阅,响应和销毁集中处理更清晰,简洁
RXSwift三步曲:
- 创建序列
- 订阅
- 销毁
//UIButton 点击事件
func setbuttonTest()
{
self.rxButton.rx.tap
.subscribe { _ in
print("button 来了")
}
.disposed(by: disposeBag)
}
//UItextField 输入 *.text.orEmpty.changed*
func setTextFieldtest(){
rxtextField.rx.text.orEmpty.changed
.subscribe { text in
print("输入的内容\(text)")
}
.disposed(by: disposeBag)
}
//UITapGestureRecognizer
func settapGesture(){
let tapGesture = UITapGestureRecognizer()
self.rxlable.addGestureRecognizer(tapGesture)
self.rxlable.isUserInteractionEnabled = true
tapGesture.rx.event.subscribe { _ in
print("点击了label")
}
.disposed(by: disposeBag)
}
//UItextField 输入 关联显示在rxButton
func setTextFieldtest2(){
rxtextField.rx.text.bind(to: self.rxButton.rx.title())
.disposed(by: disposeBag)
}
//通知
func setNOtificationTest() {
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe { noti in
print("键盘弹出来了---\(noti)")
} .disposed(by: disposebag)
}
//timer 单次延时和 循环
func setReapetTest()
{
//有period,,循环执行;没period 延时1秒执行一次
// timer = Observable<Int>.timer(.seconds(1), period: .seconds(2),scheduler: MainScheduler.instance)
timer = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
timer.subscribe { value in
print("打印\(value)")
}
.disposed(by: disposebag)
}
//点击按钮,停止循环timer,销毁timer
func setbutoontest(){
self.rxButton.rx.tap.subscribe{
[weak self] value in
print("buttonClicked\(value)")
print("销毁垃圾袋,销毁timer")
self?.disposebag = DisposeBag()
}
.disposed(by: disposebag)
}
//网络的使用
func setTestNetWork()
{
URLSession.shared.rx.response(request: URLRequest.init(url: URL.init(string:"http://www.baidu.xxx")!))
.subscribe { response, data in
} onError: { error in
print("________错误____\(error)")
}
}
相比OC、swift原生实现的写法的写法更清晰、集中、易于阅读
ReactiveCompatible协议
- 协议内容:设置了关联属性rx
- NSObject 对象遵循了协议即可点出来rx