刚开始学习RXSwift,表示Swift都还是刚开始学习的,如果有跟我一样没接触过swift的小伙伴,可以先看看https://www.runoob.com/swift/swift-tutorial.html,重点了解下闭包、协议。话不多说,下面介绍一些RXSwift在项目里面的常用示例,相信你会爱上它的。
KVO使用
假设有一个MyPerson的类,现在要监听这个类的对象的name值的变化
class MyPerson: NSObject {
var name = "name"
}
var person:MyPerson = MyPerson()
let disposeBag = DisposeBag()
var timer: Observable<Int>!
override func viewDidLoad() {
super.viewDidLoad()
setupKVO()
setupRXKVO()
}
1、常规KVO使用
// MARK: -- 添加KVO
func setupKVO() {
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
}
// MARK: -- KVO回调
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print(change as Any)
}
2、RXSwift-KVO
func setupRXKVO() {
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value! as Any) // 监听回调
})
.disposed(by: disposeBag) // 添加进垃圾袋自动回收
}
如果不能监听回调,记得要将name的定义改为
@objc dynamic var name = "name"
Button点击响应
self.button.rx.tap
.subscribe(onNext: { () in
print("点击按钮")
})
.disposed(by: disposeBag)
默认是touchUpInside,如果要修改点击模式,可以
self.button.rx.controlEvent(.touchUpOutside)
TextField文案更新监听
self.textField.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text) // 文字变化回调
})
.disposed(by: disposeBag)
这里也可以将TextField的值与button的title绑定,即textfield的值改变,button的title也会跟着改变
self.textField.rx.text
.bind(to: self.button.rx.title())
.disposed(by: disposeBag)
ScrollView滚动监听
self.scrollView.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
self?.myView.backgroundColor = UIColor.init(red: content.y/255 * 0.9, green: content.y/255 * 0.5, blue: content.y/255 * 0.3, alpha: 1) // 滚动回调
})
.disposed(by: disposeBag)
手势监听
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe(onNext: { (tapGesture) in
print(tapGesture.view!)
})
.disposed(by: disposeBag)
NotificationCenter通知
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification) // 监听弹出键盘
.subscribe(onNext: { (notify) in
print(notify)
})
.disposed(by: disposeBag)
Timer定时器
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposeBag)
这里的定时器是不受scrollview滚动影响的