간단한 상식
비동기처리가 필요한 이유
•
네트워크 통신, 즉 서버에 데이터를 요청하는 일은 부하가 많이 걸리는 일이다.
•
만약 비동기처리를 하지 않았다고 가정하면, 테이블뷰를 스크롤 할떄마다 버벅이는 것처럼 자연스럽게 일어나지 않고, 뚝뚝 끊기는 일이 발생할 것이다. → 현재에서는 일어날 수 없는 상황
•
아이폰의 화면 주사율 60Hz
◦
아이폰은 1초에 60번 화면을 다시 그린다.
◦
어떤 메커니즘에 의해 화면을 계속 다시 그리면서, 움직이는 것처럼 보이게 만든다
•
비동기 처리를 하지 않으면 이런 메커니즘이 제대로 동작하지 못하게 만들기 때문에 화면이 버벅거린다.
•
메인 쓰레드
◦
1초에 60번 화면을 다시 그려야 하는 역할도 가지고 있다
◦
너무 오래 걸리는 작업들을 시키면 안된다 (0.016초 이상은 X)
→ 동시성 / 비동기 처리 프로그래밍! (분산 처리!)
작업(Task)을 “대기행렬”에 보내기만 하면, 우리의 iOS가 알아서 여러 쓰레드로 나눠서 분산처리를 한다.
동시성 처리
iOS 프로그래밍에서는 대기열에 크게 2가지 종류가 있다.
1.
DispatchQueue (GCD - Grand Central DispatchQueue)
•
직접적으로 쓰레드를 관리하는 개념이 아닌, 대기열(Queue)의 개념을 이용해서, 작업을 분산처리하고, OS에서 알아서 쓰레드 숫자(갯수)를 관리
•
(쓰레드 객체를 직접 생성시키거나 하지 않는) 쓰레드 보다 더 높은 레벨/차원에서 작업을 처리
•
메인쓰레드(1번)가 아닌 다른 쓰레드에서 오래 걸리는 작업(예, 네트워크 처리)들과 같은 작업들이 쉽게 비동기적으로 동작하도록 함
2.
OperationQueue
병렬 vs 동시
병렬(Parallel)과 동시성(Concurrency)의 개념
병렬 (Parallel)
•
물리적인 쓰레드에서 실제 동시에 일을 하는 개념
→ 내부적으로 알아서 동작하기 때문에 개발자가 전혀 신경 쓸 필요가 없는 영역
동시성 (Concurrency)
•
메인 쓰레드가 아닌 다른 소프트웨어적인 쓰레드에서 동시에 일을 하는 개념
→ 개발자가 신경써야 하는 영역
•
물리적인 쓰레드를 알아서 Switching하면서 엄청나게 빠르게 일을 처리
(예를들어, 2개의 쓰레드에서 일을해도 내부적인 물리적인 쓰레드는 1개만 동작하고 있을 수도 있음)
중요!
비동기처리 / 동시성 프로그래밍 → 성능 / 반응성 / 최적화와 관련