RxSwift 深入浅出(三)Subject

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

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<String>.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<String>.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<String>()
        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 :销毁了
         */
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容