[英]Dont complete on fail in Reactive Swift
我有一個從 api 捕獲事件的函數,效果很好。 唯一的問題是我不希望流在失敗時完成。
public func getDeviceEvent(deviceUID: String) -> SignalProducer<DeviceEvent, HTTPConnectorError> {
return SignalProducer<DeviceEvent, HTTPConnectorError> { observer, _ in
self.getDeviceEvent(deviceUID: deviceUID) { result in
switch result {
case .success(let deviceEvent):
observer.send(value: deviceEvent)
observer.sendCompleted()
case .failure(let error):
observer.send(error: error)
}
}
}
}
private func getDeviceEvent(deviceUID: String, completion: @escaping (Result<DeviceEvent, HTTPConnectorError>) -> Void) {
httpConnector.request(authenticated: true, target: .deviceLocationEvent(deviceID: deviceUID), parse: makeParser(), completion: completion)
}
有沒有辦法讓我繼續流? 我知道有retry
但我不想添加多次,我只想繼續。
您可以創建自己的retry
試版本,無限期retry
試(我在這里包含了一個版本,每次失敗后都會暫停給定的時間間隔):
extension SignalProducer {
func retry() -> SignalProducer<Value, Never> {
flatMapError { _ in
self.retry()
}
}
func retry(interval: TimeInterval, on scheduler: DateScheduler) -> SignalProducer<Value, Never> {
flatMapError { _ in
SignalProducer<Value, Never>.empty
.delay(interval, on: scheduler)
.concat(self.retry(interval: interval, on: scheduler))
}
}
}
然后,您可以使用on(failed:)
在無限期重試時在每次失敗時向用戶顯示一些內容:
getDeviceEvent(deviceUID: someDeviceUID)
.on(failed: { error in
print(error)
// Display this to the user
})
.retry(interval: 1.0, on: QueueScheduler())
.take(during: self.lifetime)
.startWithValues { value in
print(value)
}
這個片段假設self
是一個視圖控制器; take(during: self.lifetime)
然后將在當前視圖控制器解除分配時停止操作。 你應該做這樣的事情,以防止在最壞的情況下永遠重試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.