반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- NullObject
- @Binding
- Bug
- init?
- RFC1738/1808
- ios14
- operator
- Operators
- subject
- swift6
- URL(string:)
- IOS
- Creating Operators
- NavigationLink
- Xcode
- @Environment
- nonisolated
- RxSwift
- RxCocoa
- vim
- SwiftUI
- nestjs
- init
- SWIFT
- @State
- typeorm
- Operater
- @EnvironmentObject
- graphql
- dismiss
Archives
- Today
- Total
Tunko Development Diary
RxSwift) Scheduler 본문
scheduler는 cocoa에서의 GCD 사용과 비슷합니다.
옵저버블에서 각 연산자의 동작이나 구독할때 쓰레드를 설정해줄 수 있습니다.
RxSwift에서 Scheduler를 지정하기 위해선 두가지 메소드를 사용할 수 있습니다.
observe(on:) 과 subscribe(on:) 입니다.
observe(on:)은 뒤에 오는 모든 연산자는 전달한 Scheduler에서 코드가 작업합니다.
반면 subscribe(on:)은 옵저버블이 구독되여 어떤 스케쥴에서 작업할지 지정해줍니다. 따라서 구독하는 시점에 반영되는 subscribe(on:)은 어디에서 작성해도 관계 없습니다.
이제 예제 코드와 출력 결과를 확인하겠습니다.
let disposeBag = DisposeBag()
let backgroundScheduler = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())
Observable.just(4)
.filter { taskNumber -> Bool in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> filter")
return taskNumber.isMultiple(of: 2)
}
.observe(on: backgroundScheduler)
.map { taskNumber -> Int in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> map1")
return taskNumber * 2
}
.observe(on: MainScheduler.instance)
.map { taskNumber -> Int in
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> map2")
return taskNumber * 3
}
.subscribe {
print(Thread.isMainThread ? "Main Thread" : "Background Thread", ">> subscribe")
print($0)
}
.disposed(by: disposeBag)
출력
Main Thread >> filter
Background Thread >> map1
Main Thread >> map2
Main Thread >> subscribe
next(24)
Main Thread >> subscribe
completed
출력결과를 확인해보자.
옵저버블에서의 처음 연산자인 filter에서는 Main Thread에서 작업이 진행됩니다.
다음 연산자에서 .observe(on: backgroundScheduler) 통해 백그라운드 작업을 하겠다고 선언해줍니다.
다음에 온 map 연산자를 통한 값변형은 Background Thread 에서 진행됩니다.
또다시 메인에서 작업하기위해서 .observe(on: MainScheduler.instance) 으로 작업 쓰래드를 정해줍니다.
출력된 로그를 확인하면
main → background → main 으로 Thread 달라진것을 확인할 수 있습니다.
반응형
'Development > RxSwift' 카테고리의 다른 글
RxSwift) Error Handling (retry, retry(when:)) (0) | 2022.06.10 |
---|---|
RxSwift) Error Handling (catch, catchAndReturn) (0) | 2022.06.10 |
RxSwift) sharing Subscription Operator (share) (0) | 2022.06.08 |
RxSwift) sharing Subscription Operator (refCount) (0) | 2022.06.08 |
RxSwift) sharing Subscription Operator (multicast, publish, replay) (0) | 2022.06.08 |
Comments