AWS Amplify Sign In/Sign Out API에 Combine 을 제공해줘 사용해보기 위해 Combine 스터디를 시작했다. 그런데 하다보니 비동기 개념을 한번 더 잡고 가야할 것 같아서 결국 비동기 처리 관련해서 내용이 더 많다. Combine은 추후에 더 스터디할 예정이다.
Combine
- 애플에서 만든 RxSwift와 비슷한 프레임워크로 iOS 13.0+ 부터 사용 가능
- Customize handling of asynchronous events by combining event-processing opetators
- 처리 시간이 긴작업(비동기 이벤트)을 처리함
- 비동기 이벤트 처리를 위한 것
- 비동기처리의 사용이유는 시간절약
- 완료 이벤트 인지 방법
기존의 비동기 프로그래밍 방식은 아래의 예시가 있음
- Delegate, Closure callback, GCD, Notification center
비동기는 왜 필요함?
우선 스레드부터 알아야하는데, 스레드는 Task를 받는 일을 함. 그 Task중에는 단순연산, 네트워킹, Print 등의 작업이 예시로 있을수가 있음. 많은 스레드 중에 메인스레드는 UI를 그리는 일을 담당한다. 근데 코드 작성할 때 별도의 처리를 안했다면 메인스레드가 다 모든 처리를 하고 있었을 거라는 사실…! 뚜둥
메인 스레드에 몰린 작업들을 다른 스레드에서도 동시에 작업하도록 하는 것이 동시성 프로그래밍임.
애플에서 이를 위한 API를 만들어 놓았기 때문에 우리는 Queue에만 넣으면 됨. GCD가 우리가 큐에 보낸 작업을 스레드에 적절히 분배해준다는 것임. 이 GCD의 이름이 Dispatch Queue인 것임. 그래서 우리가 Dispatch Queue에 작업을 추가하면 GCD가 작업에 맞도록 Thread를 자동으로 생성해서 실행하고 Task가 끝나면 스레드에서 제거를 한다.
GCD?
디스패치큐: iOS 동시성 프로그래밍을 돕기 위헤 제공하는 queue
Global: 디스패치큐의 종류
Async: 비동기
DispatchQueue.global().async {
TASK 작업의 한 단위
// 클로저 내의 { } 하나의 작업 단위이기 때문에 그 안의 동작들은 순차적으로 처리될 수 있음
// 하지만 이 블럭자체는 비동기로 task를 큐에 보내는 단위임
}
Operation?
Operation에서 사용하는 큐의 이름은 Opération Queue. 얘도 사실는 내부적으로 GCD위에서 동작함
- 동시에 실행할 수 있는 동작의 최대 수 지정
- 동작 일시 중지 및 취소
기능은 좀 더 많지만 디스패치큐 보다 구현이 조금 더 복잡.
어쨋든 정리를 하면 GCD나 Operation이 Task를 받아 스레드에 분배하는 것임
그렇다면 GCD나 Operation이 작업을 받으면 스레드에 작업을 나눠줄때 하나의 스레드에 몰아줄 수가 있고, 여러 개의 스레드에 나눠줄 수가 있다. 이 작업을 Serial 직렬 큐인지, Concurrent 큐인지 명시해서 결정할 수 있다.
- 시리얼 Serial 큐 -> 한 개의 스레드에 몰아 넣기, 메인 스레드에서 분산처리 시킨 작업을 다른 한개의~~~스레드에서 처리하는 큐
- 동시 큐 Concurrent -> 메인스레드에서 분산처리 시킨 작업을 다른 여러개의 스레드에서 처리하는 큐. 몇 개의 스레드로 분산시킬지는 시스템이 알아서 결정함
그럼 언제 어느시점에 얘네들을 써야함?
- Serial은 모든 작업들이 그 전 작업이 끝나길 기다렸다가 하나씩 실행되기 때문에 task의 시작과 종류에 대한 순서 예측이 가능함
- Concurrent는 큐에 담긴 작업들을 여러개의 스레드로 분배함. 큐의 특성상 FIFO이지만 끝나는 순서는 알 수 없음. 제일 늦게들어와도 실행시간이 가장 짧으면 가장 먼저 끝날 수 있는 것임. 예를들면 cell에서 이미지를 로드할 때 어떤 데이터가 먼저 들어오는지보다 빠르면 좋기 때문에 concurrent 큐를 사용하고, 순서가 중요한 작업들을 처리해야하면 늦게 들어온것이 먼저 끝나는 것을 방지하기위해 Serial Queue를 사용해야함!
Sync/Async는 작업을 보내는 시점에 기다릴지 말지를 정함
Concurrent/Serial은 큐에 보내진 작업들을 여러개의 스레드로 할지 한개의 스레드로 할지 정하는 것. Concurrent로 하면 작업들이 순서에 상관없이 실행됨.
'[iOS] App Development' 카테고리의 다른 글
[iOS 오류] M1에서 Firebase빌드시 나타나는 오류 / Apple M1 Cocoapod 사용시 주의점 / FIRAnalyticsConnector' for architecture arm64 (0) | 2022.05.28 |
---|---|
[iOS] 회원탈퇴 기능 추가시 유의사항, UserDefault - get, set, remove, 삭제여부확인 (0) | 2022.01.30 |
[iOS] FireStore에서 데이터 정렬하기 : 쿼리방법(order by), 내림차순 (2) | 2022.01.08 |
[iOS] SwiftUI : 한 사이즈의 서로 다른 디자인 위젯 여러 개 만드는 법 (2) | 2022.01.08 |
[iOS] 동기/비동기 처리, 컴플리션 블럭(Completion Block) (0) | 2022.01.01 |