RxSwift 中的 Driver 如何不进行循环引用

问题描述 投票:0回答:1

我是学习ios开发的学生

我想知道Driver如何不进行循环引用?

下面两个代码显示不同的结果


// viewController deinit 
publishRelay
    .asDriver(onErrorJustReturn: "")
    .drive(self.publishRelay2)
    .disposed(by: disposeBag)

// viewContoller doen't deinit
publishRelay
    .subscribe(onNext: { [self] _ in
        
        self.publishRelay2.onNext("")
    })
    .disposed(by: disposeBag)

我看了驱动器代码,但有节点代码将 self 引用为弱引用。

以下为驱动方法,强参考发生

drvie

请帮我解决这个问题谢谢

ios swift uikit rx-swift
1个回答
0
投票

您是正确的,

drive
不会从订阅到
self
(视图控制器)创建弱引用。事实上,它根本不会创建对 self
any
引用。这就是为什么没有保留周期。

.drive(self.publishRelay2)
不会将
self
传递到
drive
。它仅将
publishRelay2
传递到
drive
。这里的
self
仅仅是限定
publishRelay2
,意思是“我的意思是
publishRelay2
self
属性,而不是其他称为
publishRelay2
的属性”。如果没有名称冲突,这个
self
将是多余的。

订阅将强烈引用

publishRelay2
。这可以在
drive
的实现中看到,因为传递给
subscribe
的闭包捕获了
observers
。但这本身并不会创建保留周期,因为从
publishRelay2
self
没有强引用。

另一方面,在

.subscribe(onNext: { [self] _ in ... }
的情况下,您正在传递一个强烈捕获
self
的闭包。订阅会对闭包有强引用,闭包对
self
有强引用。

如果闭包只捕获了

publishRelay2
,那么也不会有保留周期:

.subscribe(onNext: { [publishRelay2] _ in 
    publishRelay2.onNext("")
}
// or if there is a name conflict and "self." is not redundant:
.subscribe(onNext: { [relay = self.publishRelay2] _ in 
    relay.onNext("")
}
© www.soinside.com 2019 - 2024. All rights reserved.