RxSwift 深入淺出(三)Subject

RxSwift 這個(gè)框架看我就夠了旭贬,這一篇我重點(diǎn)介紹Subject這個(gè)可攻可受的好東西。搞RxSwift搪泳,我是認(rèn)真的

RxSwift 寶圖鎮(zhèn)博,咔咔點(diǎn)贊~~~~

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 其實(shí)就是對(duì) BehaviorSubject 的封裝稀轨,所以它也必須要通過(guò)一個(gè)默認(rèn)的初始值進(jìn)行創(chuàng)建。
         Variable 具有 BehaviorSubject 的功能岸军,能夠向它的訂閱者發(fā)出上一個(gè) event 以及之后新創(chuàng)建的 event奋刽。
         不同的是,Variable 還會(huì)把當(dāng)前發(fā)出的值保存為自己的狀態(tài)艰赞。同時(shí)它會(huì)在銷毀時(shí)自動(dòng)發(fā)送 .complete的 event佣谐,不需要也不能手動(dòng)給 Variables 發(fā)送 completed或者 error 事件來(lái)結(jié)束它。
         簡(jiǎn)單地說(shuō)就是 Variable 有一個(gè) value 屬性方妖,我們改變這個(gè) value 屬性的值就相當(dāng)于調(diào)用一般 Subjects 的 onNext() 方法狭魂,而這個(gè)最新的 onNext() 的值就被保存在 value 屬性里了,直到我們?cè)俅涡薷乃?         
         Variables 本身沒(méi)有 subscribe() 方法党觅,但是所有 Subjects 都有一個(gè) asObservable() 方法雌澄。我們可以使用這個(gè)方法返回這個(gè) Variable 的 Observable 類型,拿到這個(gè) 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 這個(gè)警告也是告訴大家,Variable要在接下來(lái)的版本里刪除,請(qǐng)用BehaviorRelay代替. 其實(shí)Variable有封裝 所以還挺好用,貌似現(xiàn)在UI層的很多都是Variable,不過(guò)RxSwift封裝了很多關(guān)于UI的,所以,以后會(huì)銷毀Variable這個(gè)類了
    }

    func testReplaySubject(){
        
        //ReplaySubject 在創(chuàng)建時(shí)候需要設(shè)置一個(gè) bufferSize镐牺,表示它對(duì)于它發(fā)送過(guò)的 event 的緩存?zhèn)€數(shù)。
        //比如一個(gè) ReplaySubject 的 bufferSize 設(shè)置為 2魁莉,它發(fā)出了 3 個(gè) .next 的 event睬涧,那么它會(huì)將后兩個(gè)(最近的兩個(gè))event 給緩存起來(lái)。此時(shí)如果有一個(gè) subscriber 訂閱了這個(gè) ReplaySubject旗唁,那么這個(gè) subscriber 就會(huì)立即收到前面緩存的兩個(gè).next 的 event畦浓。
       // 如果一個(gè) subscriber 訂閱已經(jīng)結(jié)束的 ReplaySubject,除了會(huì)收到緩存的 .next 的 event外检疫,還會(huì)收到那個(gè)終結(jié)的 .error 或者 .complete 的event讶请。
        
        let subject = ReplaySubject<String>.create(bufferSize: 2)
        subject.onNext("Cooci")
        subject.onNext("Gavin")
        subject.onNext("Kasery")
        
        //Gavin
       // Kasery 只打印這兩個(gè),Cooci就會(huì)從緩存清除

        subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("這是一個(gè) 完成")
        }) {
            print("銷毀了")
        }.disposed(by: disposeB)
        

        subject.onCompleted()//我現(xiàn)在完成了
        
        subject.subscribe(onNext: { (event) in
            print(event)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("完成之后的訂閱完成")
        }) {
            print("完成之后銷毀了")
        }.disposed(by: disposeB)
        
        /**
         Gavin
         Kasery
         這是一個(gè) 完成
         銷毀了
         Gavin
         Kasery
         完成之后的訂閱完成
         完成之后銷毀了
         
         發(fā)現(xiàn)完成了還打印了之前緩存的信號(hào)
         */
        
    }
    
    func testBehaviorSubject(){
        
        //BehaviorSubject 需要通過(guò)一個(gè)默認(rèn)初始值來(lái)創(chuàng)建
        //當(dāng)一個(gè)訂閱者來(lái)訂閱它的時(shí)候,這個(gè)訂閱者會(huì)立即收到 BehaviorSubjects 上一個(gè)發(fā)出的event电谣。之后就跟正常的情況一樣秽梅,它也會(huì)接收到 BehaviorSubject 之后發(fā)出的新的 event
        //這個(gè)地方正好去人了PublishSubject 訂閱之前發(fā)出信號(hào)無(wú)法監(jiān)聽(tīng)
        
        let subject = BehaviorSubject(value: "Cooci")
//        subject.onNext("Gavin")//會(huì)替換了Cooci的信號(hào)
        subject.subscribe(onNext: { (event) in
            print(event)
        } , onCompleted: {
            print("completed")
        }) {
            print("銷毀了")
        }.disposed(by: disposeB)
        
        subject.onNext("Kasery")

        subject.onNext("123") //這里替換了上面的 Kasery 的信號(hào),但是會(huì)打印兩次,印上兩次訂閱都能監(jiān)聽(tīng)到
        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錯(cuò)誤"]))
        
    }
    
    
    func testPublishSuject(){
        
        //Subject 訂閱者也是observable
        // 1: 能動(dòng)態(tài)地接受新的值
        // 2: subject有新的值的時(shí)候 通過(guò)event把新值發(fā)出給所有訂閱者
        //PublishSubject、BehaviorSubject剿牺、ReplaySubject企垦、Variable 區(qū)別:當(dāng)一個(gè)新的訂閱者剛訂閱它的時(shí)候,能不能收到 Subject 以前發(fā)出過(guò)的舊 Event晒来,如果能的話又能收到多少個(gè)
        
        //PublishSuject
        //PublishSubject是最普通的 Subject钞诡,它不需要初始值就能創(chuàng)建。
        //訂閱者從他們開(kāi)始訂閱的時(shí)間點(diǎn)起,可以收到訂閱后 Subject 發(fā)出的新 Event荧降,而不會(huì)收到他們?cè)谟嗛喦耙寻l(fā)出的
        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結(jié)束,后面就在進(jìn)行訂閱
        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 :銷毀了
         只有先訂閱,才能監(jiān)聽(tīng)到event
         一旦發(fā)出了complete后面的就無(wú)法監(jiān)聽(tīng)
         completed fourth
         fourth :銷毀了
         */
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末接箫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朵诫,更是在濱河造成了極大的恐慌辛友,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪返,死亡現(xiàn)場(chǎng)離奇詭異废累,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脱盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門邑滨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人钱反,你說(shuō)我怎么就攤上這事掖看。” “怎么了面哥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵哎壳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我幢竹,道長(zhǎng)耳峦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任焕毫,我火速辦了婚禮,結(jié)果婚禮上驶乾,老公的妹妹穿的比我還像新娘邑飒。我一直安慰自己,他們只是感情好级乐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布疙咸。 她就那樣靜靜地躺著,像睡著了一般风科。 火紅的嫁衣襯著肌膚如雪撒轮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天贼穆,我揣著相機(jī)與錄音题山,去河邊找鬼。 笑死故痊,一個(gè)胖子當(dāng)著我的面吹牛顶瞳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慨菱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼焰络!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起符喝,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闪彼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后协饲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畏腕,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年囱稽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郊尝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡战惊,死狀恐怖流昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞获,我是刑警寧澤况凉,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站各拷,受9級(jí)特大地震影響刁绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烤黍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一知市、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速蕊,春花似錦嫂丙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至唉锌,卻和暖如春隅肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袄简。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工腥放, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痘番。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓捉片,卻偏偏與公主長(zhǎng)得像平痰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伍纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容