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

目錄
垃圾袋移除通知訂閱關系
賦值新的垃圾袋會讓之前垃圾袋綁定的訂閱關系釋放
用來給timer停止
demo下載地址

前言:前端時間學習了一下RxSwift框架,全學完以后再回過頭來發(fā)現(xià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)//注意,如果讓當前控制器退出以后,讓其他頁面發(fā)送的通知可以接收到,這里就不能加垃圾袋,否則通知就被釋放了
}

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

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

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

賦值新的垃圾袋會讓之前垃圾袋綁定的訂閱關系釋放

看下面代碼,有3個按鈕,前1個按鈕綁定了成員變量的垃圾袋,第二個按鈕綁定了臨時變量垃圾袋,第3個按鈕沒有綁定垃圾袋, 當給成員變量的垃圾袋賦值新的值的時候,按鈕1,因為綁定了垃圾袋,而且垃圾袋被賦值了新的值,那么之前綁定的值就被釋放了,所以按鈕1的訂閱點擊事件也失效了.第3個按鈕沒有綁定垃圾袋,所以點擊依然可以被訂閱到,按鈕2因為綁定的是臨時變量的垃圾袋,代碼剛執(zhí)行完ViewDidLoad訂閱關系就失效了

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點擊")
        }.disposed(by: disposeBag)
        
        
        btn2.rx.tap.subscribe { (btn) in
            print("btn2點擊")
        }.disposed(by: DisposeBag())//disposebag的作用就是:當DisposeBag垃圾袋被釋放的時候,把它執(zhí)行的信號量也釋放,因為這里的是臨時變量創(chuàng)建的DisposeBag(),沒有被記錄成成員變量,出了viewDidLoad()方法之后就會被釋放.所以btn2的 點擊也被釋放了
        
        btn3.rx.tap
            .subscribe(onNext: { (btn) in
                print("btn3點擊")
            })
        
    }

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

看一下下面運行效果


image.png

用來給timer停止

下面例子timer開始5秒后, 垃圾袋被賦值新的值,結束訂閱關系,timer停止,或者點擊按鈕立即停止timer

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


@IBAction func btnTimerStart(_ sender: Any) { //點擊按鈕開始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秒后, 垃圾袋被賦值新的值,結束訂閱關系,timer停止
                self.disposeBag = DisposeBag()
            }
        })
        .disposed(by: disposeBag)
        
    }

點擊按鈕讓垃圾袋賦值新的值,從而解除timer的訂閱關系,達到停止timer的目的

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

demo下載地址

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容