所以我正在使用
RxSwift
并且有一个 function
看起来像这样:
private func setAndVerifyTestmode(isOn: Bool) {
parameterService.setTestMode(value: isOn)
.flatMap { _ in self.parameterService.requestTestMode() }
.subscribe( { [weak self] _ in
//do stuff })
.disposed(by: disposeBag)
}
我注意到我忘记在
[weak self]
中使用.flatMap
所以我这样添加它:
private func setAndVerifyTestmode(isOn: Bool) {
parameterService.setTestMode(value: isOn)
.flatMap { [weak self] (_: Int?) in
guard let self = self else { return .just(nil) }
self.parameterService.requestTestMode() }
.subscribe( { [weak self] _ in
//do stuff })
.disposed(by: disposeBag)
}
但后来它给了我一个错误:
Generic parameter Result could not be infered
我无法绕过它,所以我尝试使用嵌套的
function
而不是 closure
,结果是这样的:
private func setAndVerifyTestMode(isOn: Bool) {
func requestTestMode(_: Int?) -> Single<Int?> {
parameterService.requestTestMode()
}
parameterService.setTestMode(value: isOn)
.flatMap(requestTestMode(_:))
.subscribe( { [weak self] _ in
//do stuff })
.disposed(by: disposeBag)
}
太好了,编译器很高兴并且可以正常工作。在我的世界中,这解决了内存泄漏问题,因为我不再使用需要引用
closure
的 self
。 但是,我的一位同事告诉我,这与在 [weak self]
中不使用 closure
完全一样;并且您仍然使用嵌套的 memory leaks
受到 function
的影响。我真的看不出它们是同一回事,因为甚至没有提到self
了。
无论如何,我的问题是:我是否使用上面的嵌套函数解决了
memory leaks
、self
和 [weak self]
的问题,或者我的同事是否正确:这是同一回事;我的所作所为没有收获吗?
但是,我的一位同事告诉我,这与在闭包中不使用 [weak self] 完全一样;并且您仍然使用嵌套函数遭受内存泄漏。
你的同事错了。它与使用 weak self 不同,并且您不会因为没有使用 self 而遭受内存泄漏。
但是,还有更简单的方法:
最明显的:
.flatMap { [parameterService] _ in parameterService.requestTestMode() }
这基本上就是你在闭包中所做的。
另一种选择:
.flatMap { [weak self] _ in self?.parameterService.requestTestMode() ?? .just(0) }
发出的值是有问题的,因为您使用了 Single,您必须发出一些东西。如果你使用了 Maybe 或 Observable,你可以只使用 .empty()