Observable中的无限阻止轮询

时间:2018-11-01 13:12:41

标签: swift rx-swift

我正在使用一个允许我轮询事件(阻止)的库,直到没有更多事件(在这种情况下,它返回 <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn"> <mat-option *ngFor="let product of filteredProducts | async" [value]="product"> {{ product.name }} </mat-option> </mat-autocomplete> )。

我很想像这样实现可观察的东西:

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()循环放入线程...

1 个答案:

答案 0 :(得分:2)

您必须将循环包装在调度队列中。您还应该正确处理错误,并在完成时通知订户。还有一些取消的方法会很好...

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 }
    }
}