[iOS] - GCD 0. Info


1. Introduction

성능과 반응성은 그다지 매력적인 작업이 아닌 것처럼 보인다. 하지만 이 작업들은 잘 되면 평균인 것이고 잘 안되면 최악이기 때문에 중요하다.

앱의 속도, 성능, 그리고 전반적인 반응성을 최적화할 수 있는 여러 방법이 있는데, 그 중 concurrency에 집중해서 볼 것이다.

Concurrency란?

위키피디아에서는 concurrency를 “프로그램, 알고리즘, 문제를 순서에 독립적이거나 일부분만 정렬된 요소들이나 유닛으로 분리할 수 있는 속성“으로 정의한다. 이는 앱의 로직 중에서 어떤 부분은 같은 시간에 무작위 순서로 수행해도 올바르게 동작할 수 있는 성질을 의미한다.

현대 기기는 대부분 하나 이상의 CPU을 갖고 있고, 애플의 iPhone은 2011년 부터 듀얼 코어를 가지고 있다. 하나 이상의 코어를 가지고 있다는 말은 같은 시간에 하나 이상의 작업을 수행할 수 있는 능력이 있다는 것이다. 앱을 논리적인 코드 “조각”으로 나누면 iOS 기기가 이 여러 조각들을 동시에 수행할 수 있게 하고, 따라서 전반적인 성능이 향상된다.

Concurrency를 쓰는 이유?

앱이 가능한 한 막힘 없이 실행되게 하고 사용자가 무언가를 위해 기다리지 않게 하는 것은 매우 중요하다. “초” 단위는 일반적으로 작은 단위이지만 사람이 iPhone과 같은 기기에서 응답을 받기 위해 몇 초를 기다리는 것은 굉장히 길게 느껴진다. 만약 이렇게 앱을 사용하는데 몇 초를 기다려야 하는 상황이 생긴다면 앱이 너무 느리다며 사용자들이 앱을 사용하지 않게 되는 요인이 될 것이다.

흔히 여러 이미지가 있는 테이블을 스크롤링하는 상황에서 이런 지연 현상이 나타나는 경우가 있다. 네트워크를 통해 이미지를 다운받거나, 화면에 이미지를 보여주기 전에 전처리를 해야 할 때 스크롤링 하게 되면 버벅거릴 수 있고 로딩될때까지 “로딩” 인디케이터를 화면에 보여줘야 할 것이다.

Concurrency를 사용했을 때 이점은 앱의 전반적인 아키텍처에 대해 생각할 시간을 갖게 된다는 것이다. 단순히 작업을 끝내기 위해 많은 메서드를 작성하는 것 대신에, 병행적으로 실행될 수 있는 더 작고, 관리할 만한 메서드를 작성하게 될 것이다.

Concurrency를 사용하는 방법

이제부터 볼 핵심 내용이다. 앱을 개발하며 여러 작업들을 같은 시간에 수행할 수 있게 앱을 구조화하는 경우가 있는데, 같은 자원(e.g 변수)을 공유하는 작업들은 thread-safe하게 만들지 않는 이상 같은 시간에 수행할 수 없다. 공유 자원을 사용하는 경우에 문제가 되는데, 다른 자원들이나 읽기 전용 공유 자원에 접근하는 작업들의 경우에는 다른 스레드로 접근해서 더 빠르게 처리할 수 있다.

코드를 concurrent하게 실행시키기 위한 주된 방법에는 두 가지가 있다.

  1. Grand Central Dispatch
  2. Operation 클래스 : GCD를 기반으로 구현되었다. 재사용 가능한 코드를 백그라운드 스레드에서 실행하는 것, 하나의 스레드를 다른 스레드에 의존하게 하는 것, 그리고 operation이 시작하거나 끝나기 전에 취소하는 작업과 같은 복잡한 시나리오를 다룰 수 있다.