RxSwift中垃圾袋回收袋DisposeBag的使用技巧和demo下載

目錄
垃圾袋移除通知訂閱關(guān)系
賦值新的垃圾袋會(huì)讓之前垃圾袋綁定的訂閱關(guān)系釋放
用來(lái)給timer停止
demo下載地址

前言:前端時(shí)間學(xué)習(xí)了一下RxSwift框架,全學(xué)完以后再回過(guò)頭來(lái)發(fā)現(xiàn),后來(lái)理解的垃圾袋和最開(kāi)始時(shí)候不一樣,今天稍微總結(jié)一下

垃圾袋移除通知訂閱關(guān)系

let disposeBag = DisposeBag() //成員變量

 override func viewDidLoad() {
        super.viewDidLoad()
let UserNoti1 = "UserNoti1"
        NotificationCenter.default.rx.notification(Notification.Name(UserNoti1)).subscribe(onNext: { (noti) in
            print(Self.self,#function)
            print("接收到通知noti=",noti)
        })
        .disposed(by: disposeBag)//注意,如果讓當(dāng)前控制器退出以后,讓其他頁(yè)面發(fā)送的通知可以接收到,這里就不能加垃圾袋,否則通知就被釋放了
}

注意看這個(gè)通知在控制器viewDidLoad以后就添加了通知,因?yàn)榻Y(jié)尾有垃圾袋 .disposed(by: disposeBag),這里的disposeBag 是成員變量,如果當(dāng)前控制器消失以后,disposeBag也消失,那么通知就被釋放了,原因是,通知的訂閱關(guān)系被綁定在成員變量上面,當(dāng)成員變量釋放,訂閱關(guān)系也沒(méi)了.所以這個(gè)通知只能被當(dāng)前控制器內(nèi)發(fā)出的通知接收到,其他控制器發(fā)出的通知不能接收到.

@IBAction func btnPostNoti(_ sender: Any) {
        NotificationCenter.default.post(name: NSNotification.Name(UserNoti1), object: nil)
    }

這個(gè)按鈕操作發(fā)送了通知,在當(dāng)前控制器內(nèi)按下按鈕可以被接收到.但是如果在其他控制器里想要接受到通知,必須把上面代碼的 .disposed(by: disposeBag) 去掉,這樣監(jiān)聽(tīng)的關(guān)系不會(huì)被釋放.

賦值新的垃圾袋會(huì)讓之前垃圾袋綁定的訂閱關(guān)系釋放

看下面代碼,有3個(gè)按鈕,前1個(gè)按鈕綁定了成員變量的垃圾袋,第二個(gè)按鈕綁定了臨時(shí)變量垃圾袋,第3個(gè)按鈕沒(méi)有綁定垃圾袋, 當(dāng)給成員變量的垃圾袋賦值新的值的時(shí)候,按鈕1,因?yàn)榻壎死?而且垃圾袋被賦值了新的值,那么之前綁定的值就被釋放了,所以按鈕1的訂閱點(diǎn)擊事件也失效了.第3個(gè)按鈕沒(méi)有綁定垃圾袋,所以點(diǎn)擊依然可以被訂閱到,按鈕2因?yàn)榻壎ǖ氖桥R時(shí)變量的垃圾袋,代碼剛執(zhí)行完ViewDidLoad訂閱關(guān)系就失效了

class VC1: UIViewController {
    @IBOutlet weak var btn1: UIButton!
    @IBOutlet weak var btn2: UIButton!
    @IBOutlet weak var btn3: UIButton!
    var disposeBag = DisposeBag()
    
    deinit { print(Self.self,#function) }
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        btn1.rx.tap.subscribe { (btn) in
            print("btn1點(diǎn)擊")
        }.disposed(by: disposeBag)
        
        
        btn2.rx.tap.subscribe { (btn) in
            print("btn2點(diǎn)擊")
        }.disposed(by: DisposeBag())//disposebag的作用就是:當(dāng)DisposeBag垃圾袋被釋放的時(shí)候,把它執(zhí)行的信號(hào)量也釋放,因?yàn)檫@里的是臨時(shí)變量創(chuàng)建的DisposeBag(),沒(méi)有被記錄成成員變量,出了viewDidLoad()方法之后就會(huì)被釋放.所以btn2的 點(diǎn)擊也被釋放了
        
        btn3.rx.tap
            .subscribe(onNext: { (btn) in
                print("btn3點(diǎn)擊")
            })
        
    }

    @IBAction func btn4Click(_ sender: Any) {
        disposeBag = DisposeBag()  //給成員變量賦值新的值
    }
   

看一下下面運(yùn)行效果


image.png

用來(lái)給timer停止

下面例子timer開(kāi)始5秒后, 垃圾袋被賦值新的值,結(jié)束訂閱關(guān)系,timer停止,或者點(diǎn)擊按鈕立即停止timer

var disposeBag = DisposeBag()//成員變量垃圾袋


@IBAction func btnTimerStart(_ sender: Any) { //點(diǎn)擊按鈕開(kāi)始timer
        var timer: Observable<Int>!
        var i = 0
        timer = Observable<Int>.interval(RxTimeInterval.seconds(1), scheduler: MainScheduler.instance)
        timer.subscribe(onNext: { (num) in
            print(num)
            i += 1
            if i > 5 { //5秒后, 垃圾袋被賦值新的值,結(jié)束訂閱關(guān)系,timer停止
                self.disposeBag = DisposeBag()
            }
        })
        .disposed(by: disposeBag)
        
    }

點(diǎn)擊按鈕讓垃圾袋賦值新的值,從而解除timer的訂閱關(guān)系,達(dá)到停止timer的目的

@IBAction func btnTimerStop(_ sender: Any) {
        disposeBag = DisposeBag()//注意,這里給成員變量disposeBag賦值了新的對(duì)象以后,指向了新的空間,原來(lái)的disposeBag對(duì)象地址被釋放,這樣原來(lái)綁定的timer和通知監(jiān)聽(tīng)都被釋放了,想要好使,需要重新添加通知,和重新啟動(dòng)timer
}

demo下載地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑟枫,一起剝皮案震驚了整個(gè)濱河市斗搞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慷妙,老刑警劉巖僻焚,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膝擂,居然都是意外死亡虑啤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門架馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狞山,“玉大人,你說(shuō)我怎么就攤上這事叉寂∑计簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵屏鳍,是天一觀的道長(zhǎng)勘纯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)钓瞭,這世上最難降的妖魔是什么驳遵? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮降淮,結(jié)果婚禮上超埋,老公的妹妹穿的比我還像新娘搏讶。我一直安慰自己佳鳖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布媒惕。 她就那樣靜靜地躺著系吩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妒蔚。 梳的紋絲不亂的頭發(fā)上穿挨,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天月弛,我揣著相機(jī)與錄音,去河邊找鬼科盛。 笑死帽衙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贞绵。 我是一名探鬼主播厉萝,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榨崩!你這毒婦竟也來(lái)了谴垫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤母蛛,失蹤者是張志新(化名)和其女友劉穎翩剪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體彩郊,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前弯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秫逝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博杖。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筷登,靈堂內(nèi)的尸體忽然破棺而出剃根,到底是詐尸還是另有隱情,我是刑警寧澤前方,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布狈醉,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乃沙。R本人自食惡果不足惜滑潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渣慕。 院中可真熱鬧,春花似錦抱慌、人聲如沸逊桦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强经。三九已至,卻和暖如春寺渗,著一層夾襖步出監(jiān)牢的瞬間匿情,已是汗流浹背兰迫。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炬称,地道東北人汁果。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像玲躯,于是被迫代替她去往敵國(guó)和親须鼎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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