RxSwift進階(一)-RxSwift的初體驗

SmoothV發表於2019-07-28

該篇主要講述RxSwift的簡介以及常用的使用方式,簡單的體驗一把Rx的神奇之處

一、簡介

ReactiveX(簡寫:Rx)是一個可以幫助我們簡化非同步程式設計的框架。而 RxSwift 是 Rx 的 Swift 版本。除了 RxSwift,還有 RxJava、RxJS、Rx.Net 等,對應的OC 版本則是 RAC(ReactiveCocoa),這裡是 RxSwift 的 github 地址

Rx的特點:

  • 複合 - Rx 就是複合的代名詞
  • 複用 - 因為它易複合
  • 清晰 - 因為宣告都是不可變更的
  • 易用 - 因為它抽象的了非同步程式設計,使我們統一了程式碼風格
  • 穩定 - 因為 Rx 是完全通過單元測試的

二、RxSwift的常見使用

1.button的事件響應

let disposeBag = DisposeBag()
func setupButton() {
        button.rx.tap
            .subscribe(onNext: { () in
                print("點了我")
            })
            .disposed(by: disposeBag)
    }
複製程式碼

2.事件繫結

func setupTextField() {
        textField.rx.text
            .bind(to: textLabel.rx.text)
            .disposed(by: disposeBag)
    }
複製程式碼

3.KVO

注意:Swift是一門靜態語言,而KVO需要Runtime,所以需要宣告 @objc dynamic ,告訴系統使用該變數時使用OC方式,OC是動態語言。

import UIKit

class Person: NSObject {
   @objc dynamic var name:String = "lgh";

}
複製程式碼
var disposeBag = DisposeBag()
var person:Person = Person()
func setupKVO(){
        person.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (value) in
                print(value! as String)
            })
            .disposed(by: disposeBag)
    }
複製程式碼

4.通知(鍵盤彈起的通知)

var disposeBag = DisposeBag()
func setupNotification(){
        NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
            .subscribe(onNext: { (notification) in
                print(notification)
            })
            .disposed(by: disposeBag)
    }
複製程式碼

5.代理

var disposeBag = DisposeBag()
func setupScrollerView(){
        mainScrollView.rx.contentOffset
            .subscribe(onNext: { [weak self](offset) in
                self?.view.backgroundColor = UIColor.init(red: (255-offset.y)/255*0.8, green: (255-offset.y)/255*0.6, blue: (255-offset.y)/255*0.3, alpha: 1)
            }).disposed(by: disposeBag)
    }
複製程式碼

6.定時器

var disposeBag = DisposeBag()
var timer: Observable<Int>!
func setupTimer(){ //實現原理?
        timer = Observable<Int>.interval(1, scheduler: MainScheduler.init())
        timer.subscribe(onNext: { (num) in
            print("定時器:\(num)")
        }).disposed(by: disposeBag)
    }
複製程式碼

7.網路請求

 var disposeBag = DisposeBag()
 func setupNetwork() {
        let url = URL(string: "https://www.163.com")
        URLSession.shared.rx.response(request: URLRequest(url: url!))
            .subscribe(onNext: { (response,data) in
                print(String.init(data: data, encoding: .utf8))
            }, onError: { (error) in
                print(error)
            }).disposed(by: disposeBag)
        
    }
複製程式碼

三、RxSwift核心

  • 1.建立序列 create
  • 2.訂閱訊號
  • 3.傳送訊號
// 1:建立序列
// AnonymousObservable -> producer.subscriber -> run
let ob = Observable<Any>.create { (obserber) -> Disposable in
    // 3:傳送訊號
    obserber.onNext("傳送訊號")
    obserber.onCompleted()
    return Disposables.create()
}
// 2:訂閱訊號
let _ = ob.subscribe(onNext: { (text) in
    print("訂閱到:\(text)")
}, onError: { (error) in
    print("錯誤: \(error)")
}, onCompleted: {
    print("完成")
}) {
    print("銷燬")
}
複製程式碼

思考:

為何寫法沒有點選響應效果

var disposeBag = DisposeBag()
func setupButton() {
        button.rx.tap
            .subscribe(onNext: { () in
                print("點了我")
            })
            .disposed(by:  DisposeBag())
    }
複製程式碼

原因:臨時變數DisposeBag()釋放了

相關文章