例如,如果 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 被釋放時,此代碼將發送完成事件而不是中斷事件。因為take(duringLifetimeOf:)API說:
轉發事件,
self直到object取消初始化,此時回傳的生產者將完成。
如果我是這個 request() 的呼叫者。我想知道我的請求是否完成。如果由于“self”被 dealloc 而取消請求。然后我會得到一個完整的事件。這是不合理的。
關于將完成的事件映射到中斷事件,我的想法是否正確?
如果我的想法是對的怎么辦?
uj5u.com熱心網友回復:
我發現關心completed和事件之間的區別通常是一種反模式,如果你可以分享你是如何使用函式interrupted的,那么可能會有更好的方法來做你想做的事情。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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/436118.html
