RxSwift--销毁者Dispose源码分析

本文深入探讨RxSwift中的销毁者Dispose,分析创建序列与订阅序列的源码,揭示dispose函数的调用时机和销毁流程。重点在于如何通过dispose操作断开序列与观察者的连接,确保安全的生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

RxSwift--销毁者Dispose源码分析

我们一步步剖析销毁者的真实面目。`

1.创建序列

示例代码1:创建序列

// 1.创建序列
        let ob = Observable<Any>.create { (observer) -> Disposable in
        observer.onNext(123")
        return Disposables.create { print("销毁释放")} 
        }

底层源码分析:
  我们点击“Command + Disposables的create”进入AnonymousDisposable类:
在这里插入图片描述

  • 继承DisposeBase基类,实现Cancelable协议。
    扩展了父类的Disposables,
  • 定义create函数:其中dispose参数为一个闭包,在AnonymousDisposable初始化init函数中,将外界传入的闭包进行保存。
  • 在dispose函数中,使用fetchOr函数:
func fetchOr(_ this: AtomicInt, _ mask: Int32) -> Int32 {
    this.lock()
    let oldValue = this.value
    this.value |= mask
    this.unlock()
    return oldValue
}

  fetchOr保证只调用一次_disposeAction代码块,_disposeAction中执行:(1).将_disposeAction置为nil;(2).调用外界的闭包action,及dispose。

  那么dispose函数是什么时候调用的呢?我们继续分析:

2.订阅序列

示例代码2:订阅序列

let dispose = ob.subscribe(onNext: { (anything) in
            print("订阅到了:\(anything)")
        }, onError: { (error) in
            print("订阅到了:\(error)")
        }, onCompleted: {
            print("完成了")
        }) {
            print("销毁回调")
        }
		print("执行完毕")
		//重点:主动调用销毁dispose
        dispose.dispose()

底层源码分析:
  我们“Command + subscribe”进入ObservableType的subscribe函数,这里我们很熟悉了,但是这次我们关注的是dispose销毁。
在这里插入图片描述

  • 在event的switch判断中,.error和.completed都会自动调用disposable.despose( )进行销毁操作。
  • return中,构造一个Disposables.create——二元销毁者 BinaryDisposable,用于闭包回调。其实就是提供一个可外部调用的销毁函数dispose( )。
    在这里插入图片描述
  • Disposables.create中,传入两个参数:
    参数1:self.asObservable().subscribe(observer):该参数实际上就是Producer中的Subscribe,返回SinkDisposer:
    在这里插入图片描述

  我们发现,又用到了sink,关联起了序列的观察者与销毁者。

参数2:disposable:为外界订阅返回的销毁者,提供dispose()函数。

  上述是一系列销毁流程,那么销毁的触发操作是什么呢?那就是主动调用dispose.dispose( )发起销毁操作。

  至此,整个销毁发起、执行流程已经讲述完毕。

3.总结

  序列和观察者是不能直接销毁的,其生命周期是一直伴随着控制器生命周期的,直接销毁会出现致命问题。所以,只能将序列与观察者之间的联系——sink销毁掉,达到断开响应的目的,完成销毁操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffersonGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值