返回

深挖RxSwift销毁者Dispose源码,揭秘序列销毁过程

IOS

Rxswift (六) 销毁者Dispose源码分析

在RxSwift中,销毁者Dispose是一个非常重要的概念,它允许我们控制和管理Observable序列的销毁过程。在本文中,我们将深入分析销毁者Dispose的源码,揭示序列销毁的奥秘,帮助读者理解RxSwift中序列销毁的机制,为使用RxSwift进行应用程序开发打下坚实的基础。

销毁者Dispose的作用

销毁者Dispose的主要作用是销毁Observable序列,释放序列中包含的资源,例如内存、文件、网络连接等。当一个Observable序列被销毁时,序列中包含的所有元素将被停止发送,并且序列将不再向订阅者发送任何元素。

销毁者Dispose的使用方法

销毁者Dispose的使用方法非常简单,只需要在Observable序列被订阅之后,调用序列的dispose()方法即可。例如:

let observable = Observable.create { observer -> Disposable in
    // 这里执行序列的创建逻辑
    
    return Disposables.create {
        // 这里执行序列的销毁逻辑
    }
}

let disposable = observable.subscribe { event in
    // 这里执行序列的订阅逻辑
}

// 在合适的时候调用dispose()方法销毁序列
// 从而释放序列中包含的资源
// 例如内存、文件、网络连接等
// 或者取消订阅
Disposable.dispose()

当调用dispose()方法时,销毁者Dispose将执行序列的销毁逻辑,释放序列中包含的资源,并且序列将不再向订阅者发送任何元素。

销毁者Dispose的源码分析

销毁者Dispose的源码位于RxSwift的ReactiveKit/Disposable.swift文件中,源代码如下:

public struct Disposable: Cancelable {

    public func dispose() {
        guard disposed == false else { return }
        let _ = Hooks.willDeinitialize(object: self)
        let workItem = SafePublishSubject<Void>.deferredDispose { observer -> Disposable in
            observer.on(completed: ())
            observer.on(.next(()))
            return Disposables.create { }
        }

        lock.lock()
        defer { lock.unlock() }
        guard disposed == false else { return }
        guard workItem.isStopped else { return }
        workItem.on(Event.next(()))
        workItem.on(.completed(()))
        workItem.on(.error(RxError.unknown))
        workItem.on(.next(()))
        handlers.removeAll()
        isRecursive.value = false
        thrownError.value = nil
        completion.value = .completed(())
        dependentDisposable?.dispose()
        dependentDisposable = nil
        handlers.removeAll()
        lock.unlock()
        let _ = Hooks.didDeinitialize(object: self)
        handlers.removeAll()
        workItem.dispose()
    }
}

从源码中我们可以看到,销毁者Dispose主要由以下几个部分组成:

  • dispose()方法:用于销毁序列。
  • lock:用于对代码块进行同步。
  • handlers:用于存储对序列的订阅者。
  • isRecursive:用于判断当前序列是否正在递归销毁。
  • thrownError:用于存储序列在销毁过程中抛出的错误。
  • completion:用于存储序列的完成状态。
  • dependentDisposable:用于存储依赖于该序列的销毁者。

当调用dispose()方法时,销毁者Dispose将执行以下步骤:

  1. 调用lock()方法对代码块进行同步。
  2. 判断当前序列是否正在递归销毁,如果正在递归销毁,则直接返回。
  3. 判断当前序列是否已经销毁,如果已经销毁,则直接返回。
  4. 调用SafePublishSubject.deferredDispose()方法创建一个新的PublishSubject序列。
  5. 将新的PublishSubject序列添加到handlers集合中。
  6. 调用isRecursive.value = falseisRecursive标志位置为false。
  7. thrownError.value置为nil。
  8. completion.value置为.completed(())。
  9. 调用dependentDisposable?.dispose()方法销毁依赖于该序列的销毁者。
  10. dependentDisposable置为nil。
  11. handlers集合中的所有订阅者销毁。
  12. 调用lock.unlock()方法释放锁。
  13. 调用Hooks.didDeinitialize(object: self)方法执行序列的析构逻辑。
  14. handlers集合中的所有订阅者销毁。
  15. 销毁新的PublishSubject序列。

结语

通过对销毁者Dispose源码的分析,我们可以更深入地理解RxSwift中序列销毁的机制。在实际的应用程序开发中,合理地使用销毁者Dispose可以帮助我们更好地控制和管理序列的销毁过程,释放序列中包含的资源,从而提高应用程序的性能和稳定性。