일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- UIKit
- IOS
- Moya
- Main Thread
- SwiftUI
- URLSession
- UICollectionViewListCell
- alamofire
- 컴공선배
- interceptor
- restfulAPI
- RequestInterceptor
- ContentMode
- distinctUntilChanged
- QoS
- Xcode
- 라이징캠프
- iOS교육
- RxSwift
- dispatchqueue
- ReactiveX
- UIListContentConfiguration
- observable
- SWIFT
- observe(on:)
- cellForRowAt
- defaultContentConfiguration
- RxCocoa
- 개발블로그
- flatmap
- Today
- Total
RB의 iOS 개발 이야기
DispatchQueue의 qos는 무엇인가? 본문
이번 포스트 또한 이전 포스트에서 이어지는 글 입니다!
이전 포스트를 읽고 오시면 이해하시는데 더욱 도움이 될 것 같습니다 ㅎㅎ
Rx가 지원하는 스케줄러(schedulers)의 종류들
이번 포스트는 바로 직전의 포스트의 다음 글로 내용이 이어집니다! 이전 포스트를 확인하고 넘어오시는 것을 추천드립니다 ㅎㅎ https://rb-ios.tistory.com/12 Alamofire RequestInterceptor 사용해보기 로그
rb-ios.tistory.com
직전 포스트에서 Rx의 Scheduler에 대하여 알아봤습니다.
그런데?
.observe(on: SerialDispatchQueueScheduler.init(qos: .background))
일단 코드가 컴파일 에러도 안나며 런타임 시에도 실행에는 문제가 없었습니다.
하지만 저 qos가 정확히 뭔지? 그리고 어떠한 상황에 어떤 qos의 종류를 사용해야하는지 모르고 작성하고 있더라구요,,
그래서 qos가 뭔지에 대해서 오늘 정리해보려고 합니다!
qos가 뭐지?!
qos는 GCD에서 global queue나 custom queue를 사용할 때 qos(quality of service)를 사용해 작업의 중요도를 결정할 수 있다고 합니다. 작업의 중요도? 그렇다면 작업의 중요도가 어떻게 나눠져있는지 알아봐야겠습니다!
그 전에 먼저! qos를 왜 사용해야 하는지 부터 확인해보겠습니다!
왜 qos를 사용해야하는가?
작업의 처리는 빠르게 처리해야하는 작업은 상대적으로 더 느리게 처리해야하는 작업보다도 자원과 에너지를 더 많이 사용하게 됩니다. 따라서 제한된 자원과 에너지를 효율적으로 사용하기 위해서는 작업들을 나누어 처리해야하기에 qos가 필요한 것 입니다.
qos의 종류
qos는 6가지 종류가 있습니다. 위에서 아래 순으로 중요도가 낮은 순 입니다.
- userInteractive
- userInitiated
- default
- utility
- background
- unspecified
1. userUnteractive
사용자와 직접전인 상호작용하는 작업에 적합합니다. 예를 들어 애니메이션이나 앱의 인터페이스를 업데이트하는 등 UI 관련 이벤트를 처리할 때 사용됩니다. 유저와 상호작용하는 작업들을 처리하다 보니 작업을 처리하는데 드는 소요시간은 상당히 짧은 편입니다.
2. userInitated
사용자가 initated 한 뒤로 즉각적인 처리가 이루어져야 하는 작업에 대해 사용됩니다. 작업이 끝날 때까지 사용자가 interaction 할 수 없습니다. 따라서 사용자에게 즉각적인 결과를 알려줘야하지만 작업이 끝난 뒤에 알려줘야 한다면 userInitated를 사용하는 것이 효과적입니다. 예를 들어 파일을 열거나, 사용자가 클릭한 뒤 액션을 처리하거나 api로 부터 데이터를 로딩하는 작업 등을 수행할 수 있습니다. 소요시간은 몇초나 그보다 적게 소요됩니다.
3. default
qos를 선택하지 않으면 기본 값으로 선택되는 qos입니다. userInteractive와 userInitated 보다는 중요도가 낮고, utility와 background 보다는 높은 중요도를 갖습니다.
4. utility
즉각적인 결과가 필요하지 않은 경우에 사용할 수 있습니다. 예를 들어 데이터 다운로드 및 불러오거나 progress indicator와 함께 길게 실행되는 작업, 계산, I/O, networking 등에서 사용됩니다. 소요 시간은 수초에서 수분 단위의 소요 시간이 사용됩니다.
5. background
유저에게 직접적으로 보이지 않고 백그라운드에서 처리되는 작업의 경우에 사용하는 qos입니다. 데이터 미리 가져오기, Local DB에 데이터를 저장하는 작업, 백업, 동기화 등의 우선순위가 높지 않은 작업에서 사용합니다. 속도보다는 에너지 효율성을 고려하는 방식입니다. 아이폰의 저전력일 때 작업이 일시중단됩니다. 소요 시간은 수분에서 수시간이 소요된다고 합니다.
6. unspecified
그래서 저는 6가지 종류 중에서 api 호출에 적합한 qos는 userInitiated라고 판단되었고 아래 코드에 적용할 수 있었습니다.
let task = Observable.just(())
task
.observe(on: SerialDispatchQueueScheduler.init(qos: .userInitiated))
.do {
print("2hhh", Thread.isMainThread)
}
.flatMap { _ in
self.repository.requestAccessToken()//requestRetryAccessToken()
}
.do {
print("3hhh", Thread.isMainThread)
}
.subscribe(onNext: { result in
switch result {
case .success(let data):
print(UserDefaultsManager.token)
UserDefaultsManager.token = data.token
completion(.retry)
case .failure(let error):
completion(.doNotRetryWithError(error))
}
})
.disposed(by: disposeBag)
위와 같이 qos는 6가지의 종류로 이루어져있으며 서비스 사용 시 사용자 경험을 고려하여 qos의 종류를 준수하며 개발한다면 더욱 품질이 좋은 코드와 앱을 개발할 수 있을 것 같습니다 ㅎㅎ
이상으로 이번 포스트를 마치겠습니다.
감사합니다!
참고
https://dev-dmsgk.tistory.com/39
[Swift] DispatchQueue의 qos 사용하기
GCD에서 global큐나 커스텀 큐를 사용할 때 qos(quality of service)를 사용해 작업의 중요도를 결정할 수 있습니다. 그렇기 때문에 작업의 우선순위를 결정하기 위해서는 qos의 우선순위가 어떻게 되는지
dev-dmsgk.tistory.com
'iOS > Swift' 카테고리의 다른 글
Status Code에 따른 네트워크 처리 (0) | 2023.12.05 |
---|---|
그래프(Graph), 트리(Tree), BFS/DFS 정리 (0) | 2023.10.13 |
Swift - TableView / UIListContentConfiguration이란 무엇인가 (0) | 2023.09.15 |
UIImageView의 contentMode에 대한 정리 (0) | 2023.09.02 |