RxSwift - Scheduler

JSLee·2022년 3월 8일
0

Scheduler

scheduler(스케줄러) 란 ?


쉽게 설명하면 Thread 이다.
MainThread 외에 Networking Task 등을 Background 에서 Async(비동기) 하게 작업하고 싶으면 MultiThreading 을 통해서 분기처리 해주면 된다.

Scheduler 의 default 는 MainThread 이다.

Operator

Scheduler 를 사용하기 위한 Operator 는 2가지 가 있다.

observe(on:)

  • 파라미터로 지정한 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:)

subscribe(on:) 은 observe(on:) 과 비슷하지만 다른 성격을 띄고 있습니다.

  • 호출 지점에 관계없이 Observable 이 작동을 시작할 Thread 를 지정합니다.

가장 상단 이미지 에서도 볼수 있듯이 subscribe(on:) 은 3번째에서 호출 되지만 Thread 의 첫 시작은 subscribe(on:) 으로 지정한 Thread로 진행됩니다.

  • 처음 호출한 Scheduler 만 사용한다.

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

Scheduler 의 종류

MainScheduler - serial

  • MainThread 에서 가장 위에 존재 UI 관리 Thread로 적절
  • API 등 무거운 작업들은 피해야 한다.
  • MainScheduler.instance
  • 동기적으로 진행
  • MainScheduler.asyncInstance
  • 비동기적으로 진행 , 왠만하면 잘 사용하지 않음 이유 : UI 작업중 갑자기 비동기처리를 진행할일이 적기에
  1. CurrentThreadScheduler

    현재 쓰레드를 이용한다.

  2. SeriaDispatchQueueScheduler

    DispatchQueue의 Serial Queue를 이용한다.
    ​background에서 추출하는 일을 처리할 때 사용 (Firebase를 사용할 때 서버의 endpoint에 너무 많은 pressured을 줄일 수 있음)

  3. ConcurrentDispatchQueueScheduler

    백그라운드에서 DispatchQueue의 ConcurrentQueue를 이용한다.
    ​SerialDispatchQueueScheduler와 같이 추출하는 일을 처리할 때 사용, 단 병렬적
    (작업량이 많은 일에 사용)

  4. OperationQueue

    NSOperationQueue를 이용해서 복잡한 작업을 할 때 쓰인다. 백그라운드에서 실행된다.

profile
iOS/Android/FE/BE

0개의 댓글