在 ReactiveSwift 中发生 take(duringLifetimeOf:) 时如何将完成的事件映射到中断事件
How to map a completed event to an interrupt event when take(duringLifetimeOf:) happened in ReactiveSwift
例如,如果 viewModel 是 dealloc,我想在我的 viewModel 中发送一个请求。请求信号应该发送中断事件。
这是我的代码
func request() -> SignalProducer<Data, Error> {
let request: SignalProducer<Data, Error> = ..... (This signal is from another module)
return request.take(duringLifetimeOf: self)
}
当 self 被 dealloc 时,此代码将发送完成事件而不是中断事件。因为take(duringLifetimeOf:)
API说:
Forward events from self
until object
deinitializes, at which point the returned producer will complete.
如果我是这个request()的调用者。我想知道我的请求是否完成。如果由于“self”被 dealloc 而取消请求。然后我会得到一个完成的事件。这不合理。
我把完成事件映射到中断事件的想法对吗?
如果我的想法是对的怎么办?
我发现关心 completed
和 interrupted
事件之间的区别通常是 anti-pattern,可能有更好的方法来做你想做的事情如果您可以分享您使用 request()
函数的具体情况,请执行此操作。
就是说,这里有一个小的自定义运算符,我认为它可以完成您想要做的事情:
extension SignalProducer {
func interrupt(after lifetime: Lifetime) -> SignalProducer<Value, Error> {
return SignalProducer<Value, Error> { observer, innerLifetime in
innerLifetime += self.start(observer)
innerLifetime += lifetime.observeEnded(observer.sendInterrupted)
}
}
}
那么你可以这样做而不是使用 take(duringLifetimeOf:)
:
func request() -> SignalProducer<Data, Error> {
let request: SignalProducer<Data, Error> = ..... (This signal is from another module)
return request.interrupt(after: self.reactive.lifetime)
}
例如,如果 viewModel 是 dealloc,我想在我的 viewModel 中发送一个请求。请求信号应该发送中断事件。
这是我的代码
func request() -> SignalProducer<Data, Error> {
let request: SignalProducer<Data, Error> = ..... (This signal is from another module)
return request.take(duringLifetimeOf: self)
}
当 self 被 dealloc 时,此代码将发送完成事件而不是中断事件。因为take(duringLifetimeOf:)
API说:
Forward events from
self
untilobject
deinitializes, at which point the returned producer will complete.
如果我是这个request()的调用者。我想知道我的请求是否完成。如果由于“self”被 dealloc 而取消请求。然后我会得到一个完成的事件。这不合理。
我把完成事件映射到中断事件的想法对吗?
如果我的想法是对的怎么办?
我发现关心 completed
和 interrupted
事件之间的区别通常是 anti-pattern,可能有更好的方法来做你想做的事情如果您可以分享您使用 request()
函数的具体情况,请执行此操作。
就是说,这里有一个小的自定义运算符,我认为它可以完成您想要做的事情:
extension SignalProducer {
func interrupt(after lifetime: Lifetime) -> SignalProducer<Value, Error> {
return SignalProducer<Value, Error> { observer, innerLifetime in
innerLifetime += self.start(observer)
innerLifetime += lifetime.observeEnded(observer.sendInterrupted)
}
}
}
那么你可以这样做而不是使用 take(duringLifetimeOf:)
:
func request() -> SignalProducer<Data, Error> {
let request: SignalProducer<Data, Error> = ..... (This signal is from another module)
return request.interrupt(after: self.reactive.lifetime)
}