在 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 而取消请求。然后我会得到一个完成的事件。这不合理。

我把完成事件映射到中断事件的想法对吗?

如果我的想法是对的怎么办?

我发现关心 completedinterrupted 事件之间的区别通常是 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)
}