RxSwift初探

1,413 阅读1分钟

一、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)