RxSwift是一种函数式响应编程的框架。RxSwift遵循Functional Reactive Programming(FRP)的设计规范,其目的是通过类似于信号流或者观察者的方式来实现代码的逻辑运算,使代码更加的简洁、明了。
关于RxSwift的环境搭建非常简单,这里就不在详细赘述。
KVO实现
传统方法实现:
1.添加监听addObserver
func setupKVO() {
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
}
2.实现observeValue
方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print(change as Any)
}
3.移除监听
deinit {
self.removeObserver(self.person, forKeyPath: "name", context: nil)
}
RxSwift实现:
func setupKVO() {
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value as Any)
})
.disposed(by: disposeBag)
}
大家感受到RxSwift的魅力了吗?接下来我们继续体验其他的应用。
RxSwift应用-button响应
func setupButton() {
// 业务逻辑 和 功能逻辑
// 设计
self.button.rx.tap
.subscribe(onNext: { () in
print("点击来了")
})
.disposed(by: disposeBag)
}
RxSwift应用-textfiled
func setupTextFiled() {
self.textFiled.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text)
})
.disposed(by: disposeBag)
self.textFiled.rx.text
.bind(to: self.button.rx.title())
.disposed(by: disposeBag)
}
RxSwift应用-scrollView
func setupScrollerView() {
scrollView.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)
})
.disposed(by: disposeBag)
}
RxSwift应用-手势
func setupGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe(onNext: { (tap) in
print(tap.view)
})
.disposed(by: disposeBag)
}
RxSwift应用-通知
func setupNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (noti) in
print(noti)
})
.disposed(by: disposeBag)
}
RxSwift应用-timer定时器
func setupTimer() {
// 核心逻辑
// 1 发送一个响应
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposeBag)
}
RxSwift应用-网络请求
func setupNextwork() {
let url = URL(string: "https://www.baidu.com")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print(response)
}).disposed(by: disposeBag)
}
RxSwift案例实现
需求:
1.当用户输入用户名时,如果用户名不足 5个字就给出红色提示语,并且无法输入密码,当用户名符合要求时才可以输入密码。
2.同样的当用户输入的密码不到 5 个字时也给出红色提示语。 当用户名和密码有一个不符合要求时底部的绿色按钮不可点击,只有当用户名和密码同时有效时按钮才可点击。
3.当点击绿色按钮后弹出一个提示框,这个提示框只是用来做演示而已。
核心代码:
let usernameVaild = usernameTextFiled.rx.text.orEmpty
.map { (text) -> Bool in
return text.count >= minUsernameLength
}
// 绑定到我们验证显示
usernameVaild.bind(to: usernameValidLabel.rx.isHidden)
.disposed(by: disposeBag)
usernameVaild.bind(to: passwordTextFiled.rx.isEnabled)
.disposed(by: disposeBag)
let passwordVaild = passwordTextFiled.rx.text.orEmpty
.map { (text) -> Bool in
return text.count >= minPasswordLength
}
passwordVaild.bind(to: passwordValidLabel.rx.isHidden)
.disposed(by: disposeBag)
// 决定按钮 - button.rx.isenable
Observable.combineLatest(usernameVaild,passwordVaild) { $0 && $1}
.bind(to: loginBtn.rx.isEnabled)
.disposed(by: disposeBag)
loginBtn.rx.tap.subscribe(onNext: { () in
print("dianji")
}).disposed(by: disposeBag)
案例演示:

网友评论