我正在使用一个允许我轮询事件(阻止)的库,直到没有更多事件(在这种情况下,它返回 <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()
循环放入线程...
答案 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 }
}
}