【RxSwift进阶一】RxSwift的初体验

1,667 阅读2分钟

该篇主要讲述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()释放了