rx-swift - RxSwift:在 onNext 之后调用 onCompleted 仅提供已完成的事件
问题描述
我将一些遗留的完成块代码包装在一个 Observable 中。它将发出一个事件(下一个或错误),然后完成。问题是调用onNext(), onCompleted()
只将完成的事件发送给观察者。为什么没有next
发送事件?
更新:人员流实际上按预期工作。问题出现在下一个流中,filteredPeople。内部完成的事件被传递给它,我只是返回它,这会终止流。
我需要completed
从内部流中过滤掉事件。
let people = Observable<Event<[Person]>>()
.flatMapLatest {
return fetchPeople().asObservable().materialize()
}
.share()
// this is bound to a search field
let filterText = PublishSubject<String>()
let filteredPeople = Observable.combineLatest(people, filterText) { peopleEvent, filter in
// this is the problem. the completed event from people is being returned, and it terminates the stream
guard let people = peopleEvent.element else { return peopleEvent }
if filterText.isEmpty { return .next(people) }
return .next(people.filter { ... })
}
func fetchPeople() -> Single<[Person]> {
return Single<[Person]>.create { observer in
PeopleService.fetch { result in
switch result {
case .success(let people):
observer(.success(people))
case .failure(let error):
observer(.error(error))
}
}
return Disposables.create()
}
}
filteredPeople.subscribe(
onNext: { event in
// ?! doesn't get called
},
onCompleted: {
// we get here, but why?
},
onError: {event in
...
}).disposed(by: disposeBag)
解决方案
您尚未发布导致问题的代码。下面的代码按预期工作:
struct Person { }
class PeopleService {
static func fetch(_ result: @escaping (Result<[Person], Error>) -> Void) {
result(.success([]))
}
}
let disposeBag = DisposeBag()
func fetchPeople() -> Single<[Person]> {
return Single<[Person]>.create { observer in
PeopleService.fetch { result in
switch result {
case .success(let people):
observer(.success(people))
case .failure(let error):
observer(.error(error))
}
}
return Disposables.create()
}
}
let people = Observable<Void>.just(())
.flatMapLatest { _ in
return fetchPeople().asObservable().materialize()
}
.share()
people.subscribe(
onNext: { event in
print("onNext does get called")
print("in fact, it will get called twice, once with a .next(.next([Person])) event")
print("and once with a .next(.completed) event.")
},
onCompleted: {
print("this prints after onNext gets called")
})
.disposed(by: disposeBag)
推荐阅读
- search - 有效地从一个文件中查找另一个文件中的行
- neo4j - 在节点值中找到“GAP”?还是下一个?
- php - 未经授权:聚合 ParseQuery PHP SDK 需要主密钥
- sql - 使用两个外键的 SQL 多对一连接
- twilio - 为什么即使将重试策略设置为 all,我的 Twilio 状态回调也不会再次调用?
- python - Visual Studio Code 拒绝在虚拟环境中安装 Tensorflow
- node.js - EPERM 错误运行测试 nodejs / CodeceptJS
- firebase - 在 Flutter 中从 Firebase FireCloud 接收数据时,StreamBuilder 中的快照代码不会被执行
- python - Plaidml 无法设置:“plaidml-setup”未被识别为内部或外部命令
- asp.net - 如何在 ASP.NET Core MVC 中更改 ReturnUrl