Бесконечный блокирующий опрос в Observable - PullRequest
0 голосов
/ 01 ноября 2018

Я использую библиотеку, которая позволяет мне опрашивать события (блокирование), пока больше нет событий (в этом случае возвращается nil).

Я испытываю желание реализовать наблюдаемое так:

private func createObservable() -> Observable<MyEvents> {
    return Observable.create { observer in
        let myPollingObject = PollingObject()

        while let event = try myPollingObject.poll() {
            observer.onNext(event)
        }

        return Disposables.create()
    }
}

Где цикл while заканчивается, когда больше нет событий (и poll() возвращает nil).

Однако цикл while означает, что я никогда не return Disposables.create(), что является проблемой.

Есть ли более реактивный способ реализовать это? Мне не очень хочется помещать цикл while в поток ...

1 Ответ

0 голосов
/ 01 ноября 2018

Вы должны обернуть свой цикл в очередь отправки. Вы также должны правильно обрабатывать ошибки и уведомлять подписчика, когда они будут завершены. Также какой-то способ отменить было бы неплохо ...

func createObservable() -> Observable<MyEvents> {
    return Observable.create { observer in
        let myPollingObject = PollingObject()
        var canceled = false
        DispatchQueue.init(label: "poller").async {
            do {
                while let event = try myPollingObject.poll(), !canceled {
                    observer.onNext(event)
                }
                if !canceled {
                    observer.onCompleted()
                }
            }
            catch {
                observer.onError(error)
            }
        }
        return Disposables.create { canceled = true }
    }
}
...