サービスオブジェクトを指定すると、サービスへの各関数呼び出しで副作用が発生しないようにしたいと思います。私の場合、関数Aが何をしていても、スケジューラーが利用可能でない限り、関数Bで何も実行されません。ここでconcatMap/flatMapは同じスケジューラですぐに実行する必要があります
が、これは次のようになります。現時点では
class Service {
func handleJobA(input: String) -> Observable<String> {
return Observable.just(input)
.do(onNext: { (str) in
print ("Job A: \(str)")
})
.concatMap { input -> Observable<String> in
return Observable.just("Job AA: \(input)")
.delay(2, scheduler: self.scheduler)
.do(onNext: { (str) in
print (str)
})
}
.subscribeOn(scheduler)
}
func handleJobB(input: String) -> Observable<String> {
return Observable.just(input)
.do(onNext: { (str) in
print ("Job B: \(str)")
})
.delay(1, scheduler: scheduler)
.concatMap { input -> Observable<String> in
return Observable.just("Job BB: \(input)")
.do(onNext: { (str) in
print (str)
})
}
.subscribeOn(scheduler)
}
let scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "Service")
}
let service = Service()
_ = Observable.from(["1","2","3"])
.concatMap { service.handleJobA(input: $0) }
.subscribe(onNext:{
print($0 + " √")
})
_ = Observable.from(["1","2","3"])
.concatMap { service.handleJobB(input: $0) }
.subscribe(onNext:{
print($0 + " √")
})
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
、出力は次のようになります。
Job A: 1
Job B: 1
Job BB: 1
Job BB: 1 √
Job B: 2
Job AA: 1
Job AA: 1 √
Job A: 2
Job BB: 2
Job BB: 2 √
Job B: 3
Job BB: 3
Job BB: 3 √
Job AA: 2
Job AA: 2 √
Job A: 3
Job AA: 3
Job AA: 3 √
しかし、これは根本的な問題を示しています。内部遅延(何か、実際にはネットワークから発生する可能性があります)は、観測可能な処理が「オーダー」から抜け出す原因となります。関数は、タスクの処理を開始した後、それが行われない限り、
意味Job A: 1
Job AA: 1
Job AA: 1 √
Job B: 1
Job BB: 1
Job BB: 1 √
Job B: 2
Job BB: 2
Job BB: 2 √
Job B: 3
Job BB: 3
Job BB: 3 √
Job A: 2
Job AA: 2
Job AA: 2 √
Job A: 3
Job AA: 3
Job AA: 3 √
、誰もがアクセスのを取得していない:
は、私が欲しいのはこれです。
私は前もって非常に良いanswerを受け取った。 flatMap/concatMap(?)は両方ともスケジューラを嫌うように見えるので、完全には適用できません。
私の理論では、実際にはconcatMapコールが適切な仕事をしていますが、次にスケジューラーキューの最後に子シーケンスの省略をスケジュールします。それが行われない限り