一、KVO
1、首先我们来看下swift的实现
var addNum:MyNumer = MyNumer()
override func viewDidLoad() {
super.viewDidLoad()
self.addNum.addObserver(self, forKeyPath:"num", options: .new, context:nil)
}
override func touchesBegan(_touches:Set, with event:UIEvent?) {
addNum.num += addNum.num
}
override func observeValue(forKeyPath keyPath:String?, of object:Any?, change: [NSKeyValueChangeKey:Any]?, context:UnsafeMutableRawPointer?) {
print(self.addNum.num)
}
deinit{
self.removeObserver(self.addNum, forKeyPath:"num", context:nil)
}
2、再来看下RxSwift的实现
var addNum:MyNumer = MyNumer()
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.addNum.rx.observeWeakly(Int.self, "num")
.subscribe(onNext: {(value) in
print(value as Any)
})
.disposed(by:disposeBag)
}
override func touchesBegan(_touches:Set, with event:UIEvent?) {
addNum.num += addNum.num
}
是不是非常简洁、清晰,非常舒服!接下来我们看下别的Rx实现
二、Button、TextField、Label、ScrollView...
//button点击事件监听
self.aButton.rx.tap
.subscribe(onNext:{ ob in
print("点击了")
})
.disposed(by:disposeBag)
//监听textfield变化
self.aTextfield.rx.text.orEmpty
.subscribe(onNext:{ text in
print(text)
})
.disposed(by:disposeBag)
//textfield绑定button的title属性,传递值给title
self.aTextfield.rx.text
.bind(to:self.aButton.rx.title())
.disposed(by:disposeBag)
//textfield绑定label的text属性,传递值给text
self.aTextfield.rx.text
.bind(to:self.aLabel.rx.text)
.disposed(by:disposeBag)
//监听ScrollView的contentoffset变化
self.aScrollview.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
self?.view.backgroundColor=UIColor.init(red: content.y/255*0.33, green: content.y/255*0.88, blue: content.y/255*0.66, alpha:1)
})
.disposed(by:disposeBag)
//给label添加一个手势,监听手势点击事件
let tap = UITapGestureRecognizer()
self.aLabel.addGestureRecognizer(tap)
self.aLabel.isUserInteractionEnabled = true
tap.rx.event.subscribe(onNext: { (tap) in
print(tap.view as Any)
})
.disposed(by:disposeBag)
//通知
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext:{ noti in
print(noti)
})
.disposed(by:disposeBag)
//rxswift 定时器的实现,实际上它不是NSTimer,只是一个状态,一个可观察序列
//scrollview滚动不受影响
times = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
times.subscribe(onNext: { (num) in
print(num)
})
.disposed(by:disposeBag)
//网络请求
leturl_baidu =URL(string:"https://www.baidu.com")
URLSession.shared.rx.response(request:URLRequest(url: url_baidu!))
.subscribe(onNext: { (response,data) in
print(response)
})
.disposed(by:disposeBag)