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 |
Tags
- rxswift
- Observable
- combine
- ios
- clean architecture
- 애니메이션
- Protocol
- map
- collectionview
- HIG
- UITextView
- 스위프트
- RxCocoa
- Xcode
- Human interface guide
- UICollectionView
- 리펙토링
- 리펙터링
- Clean Code
- uitableview
- Refactoring
- uiscrollview
- 클린 코드
- swift documentation
- SWIFT
- MVVM
- swiftUI
- 리팩토링
- tableView
- ribs
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] DispatchQueue.main와 RunLoop.main의 개념 이해하기 (DispatchQueue.main와 RunLoop.main 차이) 본문
iOS 응용 (swift)
[iOS - swift] DispatchQueue.main와 RunLoop.main의 개념 이해하기 (DispatchQueue.main와 RunLoop.main 차이)
jake-kim 2023. 2. 9. 02:09DispatchQueue 개념
- DispatchQueue 개념
- 앱의 main 또는 background 스레드들을 순차적 or 스레드 세이프하게 동시 처리하는 작업 큐
- DispatchQueue.main은 serial queue이며, sync한 메인 스레드에서 돌아가는 작업 큐
- DispatchQueue의 종류
- main queue (serial)
- global queue (concurrent, qos 설정 가능)
- custom queue(디폴트는 serial이고 concurrent로 설정 가능)
RunLoop 개념
- 입력 소스(터치, 등)와 타이머 소스에 관한 이벤트 처리를 할 때 하나의 loop를 두고 그 loop안에서 이벤트를 받고 처리하는 부분을 나누는데 이때의 loop를 runloop라고 명칭 (아래 그림에서 노란색 부분)
- 각 Thread마다 하나씩 RunLoop를 소유
- RunLoop는 자동으로 생성되고 실행되지 않고, 개발자가 RunLoop.current로 프로퍼티에 접근하거나 run()으로 직접 실행할때만 동작
- 예외사항)
- Main Thread가 가지고 있는 run loop를 main run loop라고 하는데, 이 main run loop는 프레임워크 안에서 자동으로 설정하고 실행
RunLoop.main
앱 애플리케이션의 entry point인 @main 부분의 대표적인 UIApplicationMain() 함수 내부에서 초기화
- -> 앱이 초기화 되자마자 바로 터치같은 반응을 할 수 있는 이유
// Objective-c
int main (int argc, char * argv [])
{
@autoreleasepool {
return UIApplicationMain(argc,
argv,
nil,
NSStringFromClass ([appDelegate class]));
}
}
// swift
UIApplicationMain(CommandLine.argc,
CommandLine.unsafeArgv,
nil,
NSStringFromClass(AppDelegateTest.self))
- main run loop는 터치 이벤트를 받아서, 어떤 객체가 이벤트를 받아야하는지 target을 확인하고 처리
언제 RunLoop를 사용할까?
- RunLoop의 치명적인 단점
- thread safe하지 않아서, Thread안에서 또 다른 Thread의 run loop를 run하지 말것
* thread safe: 스레드들이 동시에 접근해도 문제가 없는 것
- thread safe하지 않아서, Thread안에서 또 다른 Thread의 run loop를 run하지 말것
- 별도의 스레드에서 특정 작업을 처리하면 효율이 좋은 경우 사용 (CPU 자원 효율을 위함)
- 스레드가 주기적으로 작업하는 경우
- 스레드로 구현하려는 timer
var isRunning = false
repeat {
isRunning = RunLoop.current.run(mode: .default, before: .distantFuture)
} while (isRunning)
- RunLoop 사용방법
- run loop는 항상 일하지 않고 내부적으로 일이 없을땐 쉬게끔하여 system resources를 효율적으로 관리하기 때문에 RunLoop는 while(true)처럼 계속 실행되지 않고 개발자가 실행해야 동작
- run 관련 메소드는 4가지가 존재
DispatchQueue.main과 RunLoop.main의 연관성
- DispatchQueue.main와 RunLoop.main
- serial queue이며 main thread에서 동작하도록 내부적으로 돌아가는 스레드 관리 API
- main thread는 애플리케이션이 실행될 때 자동으로 RunLoop를 설정하고 실행
- 즉, DispatchQueue.main을 사용하면 main thread에서 동작하고, 이 main thread는 자체적으로 가지고 있는 RunLoop.main을 가져다가 사용
* 참고
https://prafullkumar77.medium.com/ios-run-loop-what-why-when-7febead400b7
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] 1. CALayer 마스킹 활용 - 마스킹하는 방법 (layer.mask, .evenOdd) (0) | 2023.02.12 |
---|---|
[iOS - swift] Mirror 개념, Mirror(reflecting:) (0) | 2023.02.11 |
[iOS - swift] UITableView의 grouped 스타일 사용시 주의 사항 (footer 영역 제거 방법) (0) | 2023.02.08 |
[iOS - swift] BottomSheet 구현 방법 (바텀 시트, FloatingPanel 프레임워크 사용) (2) | 2023.02.07 |
[iOS - swift] RxSwift의 Observable, Single, Completable 구분하여 사용하기 (0) | 2023.02.06 |
Comments