본문 바로가기

iOS/STUDY

[iOS] 동시성 프로그래밍

비동기 (Asynchronous) 프로그래밍

프로그램의 주 실행 흐름을 멈추어서 기다리는 부분 없이 바로 다음 작업을 실행할 수 있게 하는 방식입니다. 즉, 코드의 실행 결과 처리를 별도의 공간에 맡겨둔 뒤 결과를 기다리지 않고 바로 다음 코드를 실행하는 병렬처리 방식입니다. 비동기 프로그래밍은 언어 및 프레임워크에서 지원하는 여러 방법으로 구현할 수 있습니다.

 

덧붙이자면 메인스레드 하나만 있다고 할 때, 어떤 작업을 실행하면 그 작업이 끝날 때까지 기다렸다가 다음 코드를 실행하는 처리 방식입니다.

 

 

 

 

동시성 (Concurrency) 프로그래밍

논리적인 용어로 동시에 실행되는 것처럼 보이는 것입니다. 싱글 코어(멀티 코어에서도 가능)에서 멀티스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아 가면서 실행되는 방식입니다. 동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 서로 번갈아 가면서 실행되고 있는 방식입니다.

 

실제로는 동시에 실행되지 않습니다.

 

 

 

 

병렬성 (Parallelism) 프로그래밍

물리적으로 동시에 정확히 동시에 실행되는 것을 말합니다. 멀티 코어에서 멀티 스레드를 동작시키는 방식으로 데이터 병렬성(Data Parallelism)과 작업 병렬성(Task Parallelism)으로 구분됩니다.

 

- 데이터 병렬성 : 전체 데이터를 나누어 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리해서 작업을 빠르게 수행하는 방법입니다.

 

- 작업 병렬성 : 서로 다른 작업을 병렬 처리하는 것을 말합니다.

 

 

 

 

동시성 (Concurrency) 과 병렬성 (Parallelism) 의 차이

동시성 프로그래밍과 병렬성 프로그래밍 모두 비동기(Asynchronous) 동작을 구현할 수 있지만, 그 동작 원리가 다릅니다. 아래 그림처럼 비유해 볼 수 있습니다.

 

즉, 동시성은 싱글코어 및 멀티코어에서 모두 구현할 수 있지만, 병렬성은 멀티 코어에서만 구현할 수 있습니다.

 

 

 

 

iOS 환경 동시성 프로그래밍 지원 종류

  1. Grand Central Dispatch (GCD) 
  2. 연산 대기열 (Operation Queue)
  3. Thread

 

 

 

OperationQueue 사용 예제

별다른 import 없이 사용이 가능합니다.

 

OperationQueue().addOperation {
        do {
            // async method - main thread
            let imageData : Data = try Data.init(contentsOf: imageURL)
            guard let image: UIImage = UIImage(data: imageData) else {
                return
            }
            // UI 와 관련된 코드는 메인스레드에서 동작해야한다.
            OperationQueue.main.addOperation {
                self.imageView.image = image
            }
        } catch {
            print(error)
        }
    }

 

데이터를 URL을 통해 가져올 때 OperationQueue 를 사용하지 않으면 메인스레드가 데이터를 가져오는 일만 실행하기 때문에 앱이 멈춰버리는 현상이 발생합니다.

그래서 OperationQueue 로 새로운 Operation 을 생성하여 처리합니다.

하지만 UI 와 관련된 코드는 메인 스레드에서 동작해야 합니다. 따라서 Operation 안에서 다시 메인 스레드로 UIImageView를 변경해줍니다.

'iOS > STUDY' 카테고리의 다른 글

[iOS] UICollectionView  (0) 2021.05.22
[iOS] xib  (0) 2021.05.22
[iOS] Photos  (0) 2021.04.30
[iOS] scrollview autolayout  (0) 2021.03.31
[iOS] The data couldn’t be read because it is missing.  (1) 2021.03.20