簡體   English   中英

不要在 Reactive Swift 失敗時完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM