RxSwift 深入浅出(三)Subject

RxSwift 这个框架看我就够了,这一篇我重点介绍Subject这个可攻可受的好东西。搞RxSwift,我是认真的

RxSwift 宝图镇博,咔咔点赞~~~~

RxSwift 深入浅出(三)Subject_第1张图片
Rxswift
  • RxSwift 深入浅出(一)RxSwift初探

  • RxSwift 深入浅出(二)高阶函数

  • RxSwift 深入浅出(三)Subject

  • RxSwift 深入浅出(四)控件应用

  • RxSwift 深入浅出(五)tableView应用

  • RxSwift 深入浅出(六)RxDataSources

  • RxSwift 深入浅出(七)网络封装

  • RxSwift 深入浅出(八)开发总结

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    let disposeB = DisposeBag()
    var name:String = "name"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

//      Observable.just("Cooci")
//        .map { (newName) -> String in
//            print(newName)
//            return "i am " + newName
//        }
//        .bind { [weak self](text) in
//            print("text == \(text)")
//            self?.name = text
//        }
//        .disposed(by: disposeB)
        
        //Subject
//        testPublishSuject()
//        testBehaviorSubject()
//        testReplaySubject()
        testVariable()
    }
    
    
    func testVariable(){
        /**
         Variable 其实就是对 BehaviorSubject 的封装,所以它也必须要通过一个默认的初始值进行创建。
         Variable 具有 BehaviorSubject 的功能,能够向它的订阅者发出上一个 event 以及之后新创建的 event。
         不同的是,Variable 还会把当前发出的值保存为自己的状态。同时它会在销毁时自动发送 .complete的 event,不需要也不能手动给 Variables 发送 completed或者 error 事件来结束它。
         简单地说就是 Variable 有一个 value 属性,我们改变这个 value 属性的值就相当于调用一般 Subjects 的 onNext() 方法,而这个最新的 onNext() 的值就被保存在 value 属性里了,直到我们再次修改它。
         
         Variables 本身没有 subscribe() 方法,但是所有 Subjects 都有一个 asObservable() 方法。我们可以使用这个方法返回这个 Variable 的 Observable 类型,拿到这个 Observable 类型我们就能订阅它了。
         */
        
        let subject = Variable("Cooci")
        subject.value = "Gavin"
        subject.asObservable().subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("Variber订阅完成")
        }) {
            print("Variber销毁")
        }
        .disposed(by: disposeB)
        
        subject.value = "Kasery"
        
        //ℹ️ [DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx 这个警告也是告诉大家,Variable要在接下来的版本里删除,请用BehaviorRelay代替. 其实Variable有封装 所以还挺好用,貌似现在UI层的很多都是Variable,不过RxSwift封装了很多关于UI的,所以,以后会销毁Variable这个类了
    }

    func testReplaySubject(){
        
        //ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数。
        //比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event。
       // 如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event外,还会收到那个终结的 .error 或者 .complete 的event。
        
        let subject = ReplaySubject.create(bufferSize: 2)
        subject.onNext("Cooci")
        subject.onNext("Gavin")
        subject.onNext("Kasery")
        
        //Gavin
       // Kasery 只打印这两个,Cooci就会从缓存清除

        subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("这是一个 完成")
        }) {
            print("销毁了")
        }.disposed(by: disposeB)
        

        subject.onCompleted()//我现在完成了
        
        subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("完成之后的订阅完成")
        }) {
            print("完成之后销毁了")
        }.disposed(by: disposeB)
        
        /**
         Gavin
         Kasery
         这是一个 完成
         销毁了
         Gavin
         Kasery
         完成之后的订阅完成
         完成之后销毁了
         
         发现完成了还打印了之前缓存的信号
         */
        
    }
    
    func testBehaviorSubject(){
        
        //BehaviorSubject 需要通过一个默认初始值来创建
        //当一个订阅者来订阅它的时候,这个订阅者会立即收到 BehaviorSubjects 上一个发出的event。之后就跟正常的情况一样,它也会接收到 BehaviorSubject 之后发出的新的 event
        //这个地方正好去人了PublishSubject 订阅之前发出信号无法监听
        
        let subject = BehaviorSubject(value: "Cooci")
//        subject.onNext("Gavin")//会替换了Cooci的信号
        subject.subscribe(onNext: { (event) in
            print(event)
        } , onCompleted: {
            print("completed")
        }) {
            print("销毁了")
        }.disposed(by: disposeB)
        
        subject.onNext("Kasery")

        subject.onNext("123") //这里替换了上面的 Kasery 的信号,但是会打印两次,印上两次订阅都能监听到
        subject.subscribe(onNext: { (event) in
            print(event)
        } , onCompleted: {
            print("completed")
        }) {
            print("销毁了")
        }.disposed(by: disposeB)
        
        //这里跟大家玩玩error
        subject.onError(NSError(domain: "myError", code: 10086, userInfo: ["myuserinfo":"10086错误"]))
        
    }
    
    
    func testPublishSuject(){
        
        //Subject 订阅者也是observable
        // 1: 能动态地接受新的值
        // 2: subject有新的值的时候 通过event把新值发出给所有订阅者
        //PublishSubject、BehaviorSubject、ReplaySubject、Variable 区别:当一个新的订阅者刚订阅它的时候,能不能收到 Subject 以前发出过的旧 Event,如果能的话又能收到多少个
        
        //PublishSuject
        //PublishSubject是最普通的 Subject,它不需要初始值就能创建。
        //订阅者从他们开始订阅的时间点起,可以收到订阅后 Subject 发出的新 Event,而不会收到他们在订阅前已发出的
        let subject = PublishSubject()
        subject.onNext("Cooci")
        subject.subscribe(onNext: { (event) in
            print("this is"+event)
        }, onCompleted: {
            print("completed")
        }) {
            print("销毁了")
        }.disposed(by: disposeB)
        
        subject.onNext("Gavin")
        subject.subscribe(onNext: { (event) in
            print("this is second"+event)
        }, onCompleted: {
            print("completed second")
        }) {
            print("second :销毁了")
        }.disposed(by: disposeB)
        
        //让subject结束,后面就在进行订阅
        subject.onCompleted()
        
        subject.onNext("Kasery")
        subject.onNext("4444")
        subject.subscribe(onNext: { (event) in
            print("this is fourth"+event)
        }, onCompleted: {
            print("completed fourth")
        }) {
            print("fourth :销毁了")
        }.disposed(by: disposeB)
        
        /**
         this isGavin
         completed
         销毁了
         completed second
         second :销毁了
         只有先订阅,才能监听到event
         一旦发出了complete后面的就无法监听
         completed fourth
         fourth :销毁了
         */
    }

}

你可能感兴趣的:(RxSwift 深入浅出(三)Subject)