Swfit学习学习资料Swift

RxSwift的使用详解

2021-01-25  本文已影响0人  adaodao3056

RxSwift的使用详解

一. RxSwift简介

1. RxSwift做了什么

2.1 RxSwift的核心思想是 Observable

let array = [1,2,3,4,5]let array2 = array.filter({$0 > 1}).map({$0 * 2})//4 6 8 10var indexGenerator = array2.generate()let fisrt = indexGenerator.next() // 4let seoncd = indexGenerator.next() //6 复制代码

2.2 RxSwift中,ObservableType.subscribe的回调(新的信号到来)一共有三

enum Event<Element>  {    case Next(Element)      // 新的信号到来    case Error(ErrorType)   // 信号发生错误,序列不会再产生信号    case Completed          // 序列发送信号完成,不会再产生新的信号}protocol ObserverType {    func on(event: Event<Element>) //监听所有的信号}复制代码

2.3 取消监听

Observable分为两种

class Observable<Element> {    func subscribe(observer: Observer<Element>) -> Disposable //调用Disposable的方法来取消 }复制代码

当然,除了手动释放,RxSwift提供了一些操作符,比如 takeUntil来根据条件取消

sequence    .takeUntil(self.rx_deallocated) //当对象要释放的时候,取消监听    .subscribe {        print($0)    }复制代码

二. RxSwift简单体验

fileprivate lazy var bag = DisposeBag()复制代码

1. RxSwift监听按钮的点击

button1.addTarget(self, action: #selector(btn1Click(_:)), for: .touchUpInside)复制代码
button1.rx.tap.subscribe { (event) in    self.button1.setTitle("按钮1", for: .normal)    print("button1")}.addDisposableTo(bag)        button2.rx.tap.subscribe { (event) in    self.textField2.text = "按钮2被点击了"}.addDisposableTo(bag)复制代码

2. RxSwift监听UITextField的文字改变

2-1. 用on方法实现

subscribe(<#T##on: (Event<Int>) -> Void##(Event<Int>) -> Void#>)复制代码
textField1.rx.text.subscribe { (event: Event<String?>) in    //将UITextField文字改变的内容显示在Label中    self.label1.text = event.element!        print(event.element!!)}.addDisposableTo(bag)        textField2.rx.text.subscribe { (event: Event<String?>) in    print(event.element)//报警告    //输出: Optional(Optional("jun"))}.addDisposableTo(bag)复制代码

2-2. 用onNext方法实现

subscribe(on: (Event<Int>) -> Void)复制代码
textField1.rx.text.subscribe(onNext: { (str: String?) in    self.label1.text = str!}).addDisposableTo(bag)复制代码

3. RxSwift改变Label中文字

label1.rx.observe(String.self, "text").subscribe(onNext: { (str: String?) in    print(str!)}).addDisposableTo(bag)        label2.rx.observe(CGRect.self, "frame").subscribe(onNext: { (rect: CGRect?) in    print(rect!.width)}).addDisposableTo(bag)复制代码

4. RxSwift监听UIScrollView的滚动

scrollView.contentSize = CGSize(width: 1000, height: 0)scrollView.rx.contentOffset            .subscribe(onNext: { (point : CGPoint) in                print(point)            }).addDisposableTo(bag)  复制代码

三. RxSwift常见操作

//创建baglet bag = DisposeBag()复制代码

1. never

let neverSqu = Observable<String>.never()neverSqu.subscribe { (_) in    //该语句不会执行    print("This will never be printed")}.addDisposableTo(bag)//调用Disposable的方法来取消 复制代码

2. empty

Observable<Int>.empty().subscribe { (event) in    //该语句只会执行一次    //输出: completed    print(event)}.addDisposableTo(bag)复制代码

3. just

Observable<Int>.just(3).subscribe { (event) in    print(event)    /*该语句只会执行两次,分别输出     1) next(3),语句结果     2) completed, 结束事件    */}.addDisposableTo(bag)        Observable.just("jun").subscribe { (event) in    print(event)    /*该语句只会执行两次,分别输出     1) next(jun),语句结果     2) completed, 结束事件    */}.addDisposableTo(bag)复制代码

4.of

Observable.of("a", "b", "2", "5.3")    .subscribe(onNext: { print($0) })    .addDisposableTo(bag)    //会分别输出 "a", "b", "2", "5.3" Observable.of("a", "b", "2", "5.3").subscribe(onNext: { (event) in    print(event)    /*该语句只会执行4次,分别输出     1) next(a),语句结果     2) next(b),语句结果     3) next(2),语句结果     4) next(3.5),语句结果     */}, onError: nil, onCompleted: nil, onDisposed: nil).addDisposableTo(bag)   //每一个闭包都设置设置了 一个默认值,故可以省略复制代码

5. from

Observable.from(["a", "b", "2", "5.3"]).subscribe { (event) in    print(event)    /*该语句只会执行5次,分别输出     1) next(a),语句结果     2) next(b),语句结果     3) next(2),语句结果     4) next(3.5),语句结果     5) completed, 结束事件     */}.addDisposableTo(bag)复制代码

6. create

1) 自定义方法创建observable的creat

6-1 无参创建creat

fileprivate func myobserable() -> Observable<Any> {    return Observable.create({ (observal: AnyObserver<Any>) -> Disposable in        observal.onNext("abc")        observal.onNext("12")        observal.onCompleted()        return Disposables.create()    })}复制代码

6-2 添加参数创建creat

fileprivate func myJunst(element: String) -> Observable<String> {    return Observable.create({ (observal: AnyObserver<String>) -> Disposable in        observal.onNext(element)        observal.onCompleted()        return Disposables.create()    })}复制代码

2) 在函数内调用自定义方法

myobserable().subscribe(onNext: { print($0) }).addDisposableTo(bag)//该语句只会执行2次,分别输出"abc", "12"         myJunst(element: "jun").subscribe(onNext: { print($0) }).addDisposableTo(bag)//该语句只会执行2次,分别输出"jun" 复制代码

7. range(给定范围, 依次显示)

Observable<Int>.range(start: 1, count: 4).subscribe { (event: Event<Int>) in    print(event)    /*该语句只会执行5次,分别输出     1) next(1),语句结果     2) next(2),语句结果     3) next(3),语句结果     4) next(4),语句结果     5) completed, 结束事件     */}.addDisposableTo(bag)复制代码

8. repeatElement(重复执行)

创建一个sequence,发出特定的事件n次

Observable.repeatElement("quanjun")    .take(3)    .subscribe(onNext: { print($0) })    .addDisposableTo(bag)    //该语句只会执行3次,每次都输出"quanjun"  复制代码

9. generate(类似于for循环)

let generate = Observable.generate(initialState: 0, condition: { $0 < 5 }, iterate: { $0 + 2 })generate.subscribe({ print($0) }).addDisposableTo(bag)                /*1> 输出顺序:         next(0)         next(2)         next(4)         completed                  2> 以上代码可以理解为for循环处理逻辑        for (Int i = 0; i < 5; i++) {            print(i)        }        */复制代码

10. error(发出错误信号)

 let error = NSError(domain: "错误", code: 10, userInfo: nil) as Error Observable<Any>.error(error)            .subscribe({ print($0) })            .addDisposableTo(bag)        //输出: error(Error Domain=错误 Code=10 "(null)")复制代码

四. RxSwift中Subjects

1. PublishSubject

let pSubject = PublishSubject<String>()pSubject.subscribe { (event: Event<String>) in        print("2--", event)    }.addDisposableTo(bag)print("1--------------")        pSubject.onNext("T")pSubject.onNext("Q")        pSubject.subscribe { (event: Event<String>) in         print("3--", event)    }.addDisposableTo(bag)pSubject.onNext("J")            /*输出顺序为:         1--------------         2-- next(T)         2-- next(Q)         2-- next(J)         3-- next(J)     */ 复制代码

2. ReplaySubject

2-1. createUnbounded()表示接受所有事件

let rSubject = ReplaySubject<String>.createUnbounded()rSubject.onNext("T")rSubject.onNext("Q")rSubject.subscribe { (event: Event<String>) in         print("0--", event)    }.addDisposableTo(bag)        rSubject.onNext("J") /*输出顺序为:     0-- next(T)     0-- next(Q)     0-- next(J)  */复制代码

2-2. create(bufferSize: 4) 表示可接受到的订阅他之前的事件的个数

let rSubject1 = ReplaySubject<String>.create(bufferSize: 1)rSubject1.onNext("T")rSubject1.onNext("Q")rSubject1.subscribe { (event: Event<String>) in            print("4--", event)        }.addDisposableTo(bag)        rSubject1.onNext("J") /*输出顺序为:     4-- next(Q)     4-- next(J)  */  复制代码

3. BehaviorSubject

let bSubject = BehaviorSubject(value: "G")bSubject.subscribe { (event: Event<String>) in        print("5--", event)    }.addDisposableTo(bag)        bSubject.onNext("Y")bSubject.onNext("Q")        bSubject.subscribe { (event: Event<String>) in        print("6--", event)    }.addDisposableTo(bag)        bSubject.onNext("J") /*输出顺序为:         5-- next(G)         5-- next(Y)         5-- next(Q)         6-- next(Q)         5-- next(J)         6-- next(J) */ 复制代码

4. Variable

Variable是BehaviorSubject一个包装箱,就像是一个箱子一样,使用的时候需要调用asObservable()拆箱,里面的value是一个BehaviorSubject,他不会发出error事件,但是会自动发出completed事件。
let variable = Variable("S")variable.asObservable().subscribe { (event) in        print("7--", event)    }.addDisposableTo(bag)        variable.value = "D"variable.value = "Q"        variable.asObservable().subscribe { (event) in        print("8--", event)    }.addDisposableTo(bag)        variable.value = "j" /*输出顺序为:         7-- next(S)         7-- next(D)         7-- next(Q)         8-- next(Q)         7-- next(j)         8-- next(j)         7-- completed         8-- completed  */ 复制代码
上一篇下一篇

猜你喜欢

热点阅读