RxSwift和可变参数DisposeBag的秘密

使用RxSwift的最新功能之一来显着清理代码

我的公司已经将RxSwift用于所有新的iOS项目已有一段时间了,我们开始欣赏它的强大功能,灵活性和简洁性。

就是说,我们可以说RxSwift在一个区域不那么简洁。 实际上,这是完全多余的。

所以今天,让我们谈谈Disposables和DisposeBags。

一次性用品和DisposeBags?

如您所知,Disposables和DisposeBags是RxSwift对Swift的ARC内存管理的让步。

当您订阅或绑定到RxSwift Observable或从RxSwift Observable驱动时,该订阅将返回Disposable。 一次性使用基本上是对该订阅以及该订阅的整个Observable链的引用。

在处置该一次性物品之前,订阅链一直存在(除非订阅收到完成事件或错误事件,但这是另外一回事了)。

所以。 最重要的是,订阅会返回我们需要维护的一次性物品,以便正确控制订阅的生命周期。

为了方便起见,这些一次性物品通常插入已创建的DisposeBag中,并附加到UIViewController(或在某些情况下附加到View Model或其他对象)。

一个DisposeBag就是它所说的,一袋(或一组)一次性用品。

那对我们有什么帮助呢?

好了,当视图控制器被释放时,其变量(包括bag)将被释放。 释放disposeBag时,其deinit函数将对其包含的所有一次性用品调用dispose。

那些可抛弃型对象继而释放它们可能要参考的任何可观测对象引用,也可能继而释放对观测对象引用,依此类推,等等,直至完成。

一切都已正确释放,没有泄漏,每个人都很高兴。

除了一个小问题。

冗余

因此,假设您使用的是RxSwift,而您使用的是MVVM(模型-视图-视图模型)体系结构。

在此特定屏幕上,我们的视图模型将公开一组可观察对象,而我们的视图控制器会将这些可观察对象绑定到一组标签。 很基本的东西。

代码看起来像这样。

一切都非常简单,但是也许您在上面的示例中注意到了一些多余的样板代码?

那就对了。 每个订阅(绑定)都返回一个一次性对象,必须将其添加到disposeBag中。 每个人返回它。 并且每个人都必须维护。 没有解决的办法。

还是在那里?

解? 可变参数的处理袋

现在检查以下代码。

干净得多! 但是所有一次性用品都发生了什么?

好吧,RxSwift 4.3添加了DisposeBag的insert函数的可变版本。 可变参数可以使用一个或多个参数。 在这种情况下,一个或多个一次性用品。

因为如果您看内部dispose(by:disposeBag),您会发现它只是一行代码:disposeBag.insert(self)。

因此,我们无需获取每个订阅的结果并将其功能性地链接到Dispose(by :),而是绕过中间人并将每个人直接添加到disposeBag中。

我想您会同意代码绝对更加简洁,并且通过消除一些样板代码,我们可以更好地表达该功能的意图。

请享用。

顺便说一句,如果您发现DisposeBag上的可变参数插入很有用,欢迎您。 这是我对RxSwift项目的次要贡献之一。 😉