[iOS] Multithreading

growing·2023년 1월 10일

iOS

목록 보기
9/15

📚 Thread

한마디로 '일하는 녀석들'

여러개의 스레드가 있음에도 불구하고 지금까지는 화면을 관리하는 main thread 하나에만 일을 시켰음 (나머지 스레드는 모두 Background Thread) -> 따라서 부하가 걸려 버벅이는 현상 발생



📚 Multi Threading

여러개의 스레드에서 일을 하도록 하는 것

코드

  • 방법 1)
DispatchQueue.global().async{
	// task	
}
- DispatchQueue : 큐에 보낼거다
- global() : 글로벌 큐에
- async : 비동기적으로

  • 방법 2)
let queue = DispatchQueue.global()

queue.async{
	// task
}
- 보낼 큐의 종류를 미리 선언하고, 그 큐를 사용


📚 GCD / Operation

우리는 queue(대기열)만 만들어서 작업을 보내주기만 하면 iOS가 스레드를 만들어서 관리해주는 방법 2가지

GCD (Grand Central Dispatch)

  • 간단한 일, 함수 사용 작업 (메서드 위주)

Operation

  • 복잡한 일, 데이터와 기능을 캡슐화한 객체
  • GCD를 기반으로 하여 기능 추가 (취소/순서지정/일시중지(상태추적))
  • 클래스이므로 재사용 용이


📚 비동기(async) vs 동기(sync)

비동기(async)

원래 작업이 진행되고 있던 곳(메인스레드)에서 큐로 작업을 보내고, 그 작업이 완료되는 것을 기다리지 않고 다시 메인스레드로 돌아와서 다음 작업을 처리

동기(sync)

작업을 시키고 해당 작업이 완료될 때까지 기다림

  • 실질적으로는 큐로 보내지 않고 메인스레드에서 일을함



📚 직렬(Serial) vs 동시(Concurrent)

직렬(Serial)

큐가 받아들이는 작업을 모두 다른 한개의 스레드에만 보냄
=> 순서가 중요한 작업 처리시 사용

동시(Concurrent)

큐가 받아들이는 작업을 다른 여러개의 스레드에 보냄
=> 각자 독립적이지만 유사한 여러개의 작업 처리시 사용

ex) 아래와 같이 각자 하나하나의 셀에서 이미지를 불리하는 작업이 동시적으로 이루어질 경우



📚 qos

userInteractive

  • 가장 높은 우선순위
  • 애니메이션, 이벤트 처리, UI 갱신 등 사용자와의 상호작용을 하는 작업

userInitiated

  • 두번째로 높은 우선순위
  • 빠른 반응 속도가 필요하거나, 유저가 앱에 기대하는 핵심 정보를 로딩할 때 등

default

  • 세번째로 높은 우선 순위이자 기본 값

  • 앱 초기화 혹은 유저를 대신해 수행하는 작업에 사용

    utility

  • default보다 한단계 낮은 우선순위

  • 바로 완료되지 않아도 앱사용에 지장이 없는 부가적인 작업에 사용

background

  • 가장 낮은 우선순위
  • 앱이 백그라운드 상태로 갔을 때 할 작업 등에 사용


* 참고)

https://www.inflearn.com/course/iOS-Concurrency-GCD-Operation
https://jcsoohwancho.github.io/2019-10-09-DispatchQueue%EC%9D%98Qos/

profile
Hello, World!

0개의 댓글