playORM может сделать это для вас, используя S-SQL (масштабируемый SQL), который просто добавляет разделение, так что вы можете делать объединения внутри разделов.
1) При вызове:
.do {
print("1: \(Thread.current)")
}
вы собираетесь выполнить замыкание onDispose
, поэтому вам нужно передать его параметру onNext
, чтобы выполнить его, как только первая наблюдаемая испустит событие. (Это причина, по которой вы видите 2, 3, 1)
2) concat
оператор - это то, что вам нужно, если вам нужно дождаться завершения одной наблюдаемой, прежде чем выполнять следующую, так что ваш Foo.foo()
должен быть изменен, чтобы вернуть Observable.
Попробуйте этот код:
class Foo {
private let scheduler: SerialDispatchQueueScheduler
init() {
self.scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "")
foo().concat(foo()).subscribe()
}
private func foo() -> Observable<Int> {
return Observable<Void>.just(())
.subscribeOn(scheduler)
.do(onNext: {
print("1: \(Thread.current)")
})
.map { () -> Bool in
print("2: \(Thread.current)")
return true
}
.flatMap { (shouldLoad) -> Observable<Int> in
print("3: \(Thread.current)")
let observableThatSwitchesScheduler = secretObservable
.do(onNext: { _ in
print("4: \(Thread.current)")
})
return observableThatSwitchesScheduler
}
.do(onNext: { _ in
print("5: \(Thread.current)")
})
.observeOn(MainScheduler.instance)
}
}