[RC]4주차 실습 - Thread

iOSoo·2021년 10월 3일
0
post-thumbnail

[비동기 사용해보기]

1. 우선 0에서 100까지, 100에서 0까지 숫자가 출력되는 코드를 작성해주고 순서대로 실행해보자.

<실행결과>

2. 이제 비동기를 사용해서 숫자가 반복적으로 출력되도록 코드를 작성하고 실행해보자

코드에 대해서 설명하자면

global dispatch queue에 비동기로 task를 보낸다

각각의 코드를 뜯어서 설명해보겠다.

  1. GCD
    : GCD는 Thread Safe한 DispatchQueue를 제공하여 Multi - Threading 작업을 수행할 수 있도록 해준다. GCD가 제공하는 Queue는 총 3가지가 있는데
  • main(Serial) : 모든 UI작업은 Main Queue에서 수행해야한다.

  • global(Concurrent) : 작업의 우선순위를 사전에 저의한 4가지 qos를 활용하여 작업을 수행한다.

  • custom : Serial / Concurrent 모두 정의할 수 있지만 임의로 Serial Queue를 개발자가 만들 때 사용한다. 같은 Serial Queue인 Main Queue에서 처리하기에는 부적합하고 뒤에서 Serial로 돌아갈 필요가 있는 작업을 수행할 때 만들어준다. (global queue에서 수행)

  1. QoS
    : 어떤 작업을 Multi - Threading으로 Concurrent하게 처리하고자할 때 global queue를 쓰게 되는데 이 때, 해당 작업의 우선 순위를 지정할 떄에는 미리 중요도가 정의된 QoS를 사용하도록 한다.

하지만 대부분 OS 자체에서 설정해주기 때문에 우리가 따로 지정할 경우는 드물다.

  • userInteractive: 중요도 1순위, 가장 자원을 많이 쓰도록하는 QoS이다.

  • userInitiated: 중요도 2순위. 1순위는 아니더라도 유저가 빠른 결과를 기대할 때 사용하는 Qos입니다.

  • utility: 시간이 다소 오래거리는 처리를 한다.

  • background: 유저가 인지하지도 못하는 뒤단에서 실행되는 작업들이다.

<실행결과>

[공유자원의 문제]

여기에서 언급했던 공유자원의 문제를 실습으로 진행해보자.

1. 비동기로 처리해보자.

<실행결과>

2. 동기로 처리해보자.

<실행결과>

실행결과를 보게되면 다르다는 것을 알 수 있다. 이 예제로 우리는 동기와 비동기를 언제 사용해야하는지 알 수 있다.

주의⚠️ 비동기로 실행한다고 해서 두개의 Task가 동시에 작업되는건 아니다. 비동기는 순서대로 작동하기는 하나 Task1 먼저 작동함과 동시에 Task2가 작동하는 것이다.

[Thread 활용하기]

1. 스토리보드를 아래와 같이 만들어준뒤 (UIView - Label) colorViewController와 연결해준다.


2. 아래와 같이 코드를 작성한다.

<실행결과>


실행을 해보면 색이 변경되지 않는다.
그 이유는 UI는 Main Thread가 담당하는데 현재는 Main Thread가 없기 때문이다.

3. 그러면 이제 Main Thread가 있는 코드를 작성해보자.

<실행결과>

[Delay를 주고싶을 때]

여기의 코드처럼 uslepp 또는 sleep을 사용해도 되지만 아래의 코드를 사용하는 것이 좋다.

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
      //1초뒤 실행할 Task
}

실습자료

https://github.com/iOS-junsoo/Week4_Training

profile
애플을 좋아하는 비전공생

0개의 댓글