scheduler(스케줄러) 란 ?
쉽게 설명하면 Thread 이다.
MainThread 외에 Networking Task 등을 Background 에서 Async(비동기) 하게 작업하고 싶으면 MultiThreading 을 통해서 분기처리 해주면 된다.
Scheduler 의 default 는 MainThread 이다.
Scheduler 를 사용하기 위한 Operator 는 2가지 가 있다.
파라미터로 지정한 Scheduler 를 받는다.
observe(on:) 은 Scheduler 를 변경할수 있다.
observe(on:) 을 통한 Thread 를 지정받는 Observable 은 Operator 가 실행될때 Create 된다.
Observable.just(“800x600”)
.observeOn(ConcurrentDispatchQueueScheduler(qos: .default))
.map { $0.replacingOccurreces(of: “X”, with “ / ”) }
.map { “https://picsum.photos/\($0)/?random” }
.map { URL(string: $0) }
.filter { $0 != nil }
.map { $0! }
.map { try Data(contentsOf: $0) }
.map { UIImage(data: $0) }
.observeOn(MainScheduler.instance) // MainThread로 분기처리
.subscribe(onNext: { image in
self.imageView.image = image
})
.disposed(by: disposeBag)
}
위에 예시 코드를 보게 되면 observe(on:) 은 Observable 이 해당 연산자가 나타나는 아래 에서 사용할 Thread 에 영향을 줍니다. 이러한 이유로 특정 Operator 가 작동하는 Thread 를 변경하기 위해 Observable Operator Chain 의 다양한 지점에서 Observe(on:) 을 여러번 호출할수 있습니다.
subscribe(on:) 은 observe(on:) 과 비슷하지만 다른 성격을 띄고 있습니다.
가장 상단 이미지 에서도 볼수 있듯이 subscribe(on:) 은 3번째에서 호출 되지만 Thread 의 첫 시작은 subscribe(on:) 으로 지정한 Thread로 진행됩니다.
observe(on:) 의 경우 아래에서 실행할 Thread에 영향을 줄수 있습니다.
ex) Background 에서 MainThread 로 변경
하지만 subscribe 는 이러한 기능을 수행할수 없습니다.
_ = Observable.create() { observer in
print(Thread.inMainThread)
return Diposables.create()
}
.subscribe(on : ConcurrentDispatchQueueScheduler(qos : .background ) )
.map { _ in
print(Thread.isMainThread)
}
.subscribe(on : MainScheduler.instance)
.subscribe { event in
print(Thread.isMainThread)
}
.disposed(by : disposBag)
//false
//false
//false
MainScheduler - serial
CurrentThreadScheduler
현재 쓰레드를 이용한다.
SeriaDispatchQueueScheduler
DispatchQueue의 Serial Queue를 이용한다.
background에서 추출하는 일을 처리할 때 사용 (Firebase를 사용할 때 서버의 endpoint에 너무 많은 pressured을 줄일 수 있음)
ConcurrentDispatchQueueScheduler
백그라운드에서 DispatchQueue의 ConcurrentQueue를 이용한다.
SerialDispatchQueueScheduler와 같이 추출하는 일을 처리할 때 사용, 단 병렬적
(작업량이 많은 일에 사용)
OperationQueue
NSOperationQueue를 이용해서 복잡한 작업을 할 때 쓰인다. 백그라운드에서 실행된다.