TIL
🌱 난 오늘 무엇을 공부했을까?
📌 면접스터디
📍 GCD API 동작 방식과 필요성
- serial queue 방식 - main_queue
- 단일 작업'들'을 순차적으로 '하나씩'실행하는 것
- Serial Queue는 한 번에 하나의 Task만 실행
- concurrent queue 방식 - global_queue
- 동시에 하나 이상의 큐 처리 (동시적 처리이지 병렬적 처리가 아님)
- 한 번에 여러 개의 Task를 실행
- sync
- 하나의 작업이 끝나기 전까진 다른 작업을 수행하지 못함
- async
- 하나의 작업이 끝나기 전에 다음 작업을 수행한다.
- 내부 실행
- 애플리케이션이 작업을 블록 단위 형식으로 관리한다.
- 큐에 들어오는 작업을 순차적으로 실행한다.
- 작업은 동기, 비동기식으로 예약한다.
🔗 필요성
- GCD를 사용하지 않으면 스레드 생성, 유지, 삭제 등을 개발자가 모두 처리해야 하기 때문에
https://jinshine.github.io/2018/07/09/iOS/GCD(Grand%20Central%20Dispatch)/
https://www.notion.so/GCD-API-65882583e57f4d798a33ad8a25ac5fad
https://babbab2.tistory.com/64
📍 Global Dispatch Qos
- User Interactive: 사진을 스크롤하거나 로드하는 것과 같이 UI 스레드를 업데이트하는 작업을 적극적으로 수행
- User Initiated: 사용자 상호 작용이 필요한 작업을 수행 , 사용자가 시작하고 즉각적인 결과를 가져와야 하는 작업
- Utility: 일부 배경 콘텐츠를 다운로드하는 것과 같이 사용자가 인식하지 못하는 작업을 수행, 약간의 시간이 걸리고 바로 완료할 필요가 없는 작업
- Background: 사용자에게 표시되지 않는 작업. (백업, 동기화, 인덱싱)
https://medium.com/the-traveled-ios-developers-guide/quality-of-service-849cd6dee1e
📍 NSOperation과 GCD의 차이
- Operation은 GCD를 상위 수준으로 추상화한 api
- GCD는 비교적 가볍고 NSOperation는 복잡하고 무거운 편이다.
- Operation은 의존성을 제공
- NSOperation은 두 작업(operations) 사이에 의존관계를 설정하여 여러개의 작업에 대한 종속성을 가질 수 있다.
- 하나의 작업이 다른 작업에 의존성을 갖고 있다면 이 작업은 해당 작업들이 모두 끝난 후에 작업을 시작할 수 있다.
- Operation과 OperationQueue 클래스는 KVO를 통해 관찰될 수 있는 프로퍼티를 제공
- NSOperation은 작업(operation)의 상태를 ready, isCanceld, executing, finished로 구분하는데 이 여러 상태들을 모니터링 가능
- Operation이 보다 작업의 Life cycle에 대한 유연함을 제공
- NSOperation에 대한 pause, cancel, resume이 가능하다.
- Object_C 기반이고, 고수준 API라서 오버헤드가 존재한다.
🔗 언제 무엇을 사용?
- 큐에 있는 작업들에 대해 좀 더 다양하고 미세한 컨트롤이 필요하다면 NSOperation을, 적은 오버헤드로 단순한 작업들을 멀티스레드 환경에서 수행시키고 싶은 것이라면 GCD를 사용한다.
https://baked-corn.tistory.com/134
https://betterprogramming.pub/the-complete-guide-to-concurrency-and-multithreading-in-ios-59c5606795ca
📍 멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들
- 동기, 비동기
- 직렬, 동시
- 변수를 비동기로 여러 스레드에서 접근해야 한다면 어떻게 관리해야 할 지
- 특정 기능을 비동기 처리로 구현한다면, 우선순위를 정해야 할 지
- GCD를 사용해야 할 지 Operation을 사용해야 할 지
- 기능에 UI 업데이트를 포함하고 있는지