gpt4 book ai didi

swift - ReactiveSwift 的终生目标

转载 作者:可可西里 更新时间:2023-11-01 00:38:43 24 4
gpt4 key购买 nike

我已经使用 ReactiveSwift 几个月了,但有一点我还没有完全理解:生命周期对象。

例如,假设我有一个将进行 API 调用的 SignalProducer,它包装在一个类中:

class ServiceWrapped {

private let service: Service // the method called on this object returns the SignalProducer
private let (lifetime, token) = Lifetime.make()

// more stuff

func fetchSomething(completion: @escaping (Value?, Error?) -> Void) {
lifetime += service.fetchSomething()
.startWithResult { result in
switch result {
case .success(let value):
completion(value, nil)
case .failure(let error):
completion(nil, error)
}
}
}
}

我的问题是:在这种情况下是否有必要使用lifetime

我知道 lifetime 将保留服务调用,因此它在返回时有一些东西,但由于这也包含在 ServiceWrapped 上,我不认为使用 lifetime 真的很有必要。

提前致谢。

最佳答案

您是正确的,您不需要保留 startWithResult 的结果来保持订阅有效。 relevant part of the documentation says :

A Signal must be publicly retained for attaching new observers, but not necessarily for keeping the stream of events alive. Moreover, a Signal retains itself as long as there is still an active observer.

因此只要您不处置从 startWithResult 返回的对象,即使您不保留它,该操作也会继续。

相反,Lifetime 是关于取消 操作的。在这种情况下,因为您已将 startWithResult 的结果附加到 ServiceWrapped 的生命周期中,所以当 ServiceWrapped 对象为释放。如果您省略 lifetime +=,那么即使 ServiceWrapped 被释放,操作也会继续。

如果您有一个从 Web 加载图像的 View Controller ,那么一个实际例子说明了它为什么有用。如果用户在图像加载完成之前关闭了 View Controller ,那么您可能想要取消 Web 请求。您可以通过将图像加载生成器绑定(bind)到 View Controller 的生命周期来做到这一点。这不是让网络请求保持事件状态,而是在不再需要时将其取消。

顺便提一下风格,documentation recommends you use operators rather than handling the result of the startWithResult :

func fetchSomething(completion: @escaping (Value?, Error?) -> Void) {
service.fetchSomething()
.take(during: lifetime)
.startWithResult { result in
switch result {
case .success(let value):
completion(value, nil)
case .failure(let error):
completion(nil, error)
}
}
}

关于swift - ReactiveSwift 的终生目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53510919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com