Last active
January 7, 2021 10:21
-
-
Save yimajo/1bab4079190619acc6ee7da3b3c84c26 to your computer and use it in GitHub Desktop.
RxSwiftでHotなストリームにsubscribe(on:)してみる
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RxSwift | |
import Foundation | |
let queue = DispatchQueue.global(qos: .background) | |
// 念の為に書くと、ここはメインスレッドで呼び出している | |
let stream = Observable.just(1) | |
.flatMap { value -> Observable<Int> in | |
print("flatMap: isMain \(Thread.isMainThread)") | |
return .create { observer in | |
// 通信ライブラリの結果をObservableにしたものというイメージ | |
queue.async { | |
observer.onNext(value * 10) | |
} | |
return Disposables.create() | |
} | |
} | |
.share(replay: 1) | |
stream | |
.map { value -> Int in | |
print("map:, isMain \(Thread.isMainThread)") | |
return value * 100 | |
} | |
.subscribe(on: ConcurrentDispatchQueueScheduler(queue: queue)) | |
.observe(on: MainScheduler.instance) | |
.subscribe(onNext: { | |
print("onNext: \($0) isMain \(Thread.isMainThread)") | |
}) | |
stream | |
.map { value -> Int in | |
print("map2:, isMain \(Thread.isMainThread)") | |
return value * 100 | |
} | |
.subscribe(on: MainScheduler.instance) | |
.observe(on: MainScheduler.instance) | |
.subscribe(onNext: { | |
print("onNext2: \($0) isMain \(Thread.isMainThread)") | |
}) |
Author
yimajo
commented
Jan 7, 2021
- Hotだからコントロールできないわけじゃなく、flatMapは別スレッドで動いている
- subscribe順にコントロールしてるように見る
- 2つ目のsubscribeでは意味がないことがわかるし、mapまでも別スレッドで動いてしまっている
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment