2016년 9월 5일 월요일

dispatch_async 비동기 처리 @@ in Swift2.x - Xcode 7.3 iOS 9.3

1. 동기와 비동기 개념

  - 동기

  동기 (Synchronize) 방식이란 주어진 명령을 차례대로 처리하되 하나의 업무가 완료될 때 까지는 다음 업무로 넘어가지 않는 방식을 말한다

  - 비동기

  비동기 방식이란 주어진 명령을 차례대로 처리하되 시간이 걸리는 업무는 진행해둔 채로 기다리는 동안 다른 업무를 처리하는 방식입니다.

  - 장단점

  동기 방식은 일관 적인 업무 흐름을 보장 받을 수 있고 동시다발 적 업무가 발생하지 않으므로 이를 제어하기 위한 대응이 불필요, 업무 구성이 단순 해지는 장점을 가지고 있으나 업무를 차례대로 진행하기 때문에 대기 시간이 생기게 되고 시간을 효율적으로 사용하지 못한다는 단점이 있습니다.
비동기 방식은 대기 시간을 줄여줄 수 있으므로 효율적이지만 업무의 구성이 복잡해지기 때문에 일괄적인업무 흐름이 깨지고 이를 제어하기 위한 대응이 필요합니다.

2. 비동기 구현 방식

  iOS Swift에서는 비동기 실행 함수 dispatch_async()를 제공하여 개발자가 내부적으로 프로세스나 스레드에 직접 접근하지 않고도 비동기 방식으로 처리를 할 수 있도록 지원합니다.
글로벌 범위에서 사용할 수 있는 이 함수는 블록(Block)과 GCD를 이용하는데, 이중 GCD는 애플에서 개발한 기술로서 병렬처리와 스레드 풀에 기반을 둔 비동기 방식을 구현해줍니다

3. 구현방식 정리(GCD) 


Serial Dispatch Queue

- FIFO 방식으로 Queue에 대기하는 작업을 순차적으로 처리하는 방식이다. 하나의 작업이 Thread에 의해 실행중이면 다른 작업은 Queue 내부에서 대기하고 있다.

Concurrent Dispatch Queue
- 간단하게 생각하면 큐에 들어오는 작업을 동시적으로 별도의 Thread에서 처리하는 방식이다. 실행되는 Thread의 개수는 시스템 상태에 따라 달라지며, OS에서 알아서 관리해준다.

// 새로운 시리얼 디스패치 큐를 생성한다
dispatch_queue_t serialQueue = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);

// 새로운 콘커런트 디스패치 큐를 생성한다
dispatch_queue_t concurrentQueue = dispatch_queue_create("ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);


// 메인 디스패치 큐를 얻어온다
dispatch_queue_t mainQueue = dispatch_get_main_queue();

// 글로벌 디스패치 큐를 얻어온다
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);



출처 : http://ycsycs.tistory.com/3
출처 : [iOS] GCD를 활용한 이미지 비동기 처리하기 |작성자 zzozzo




dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
대해서만 알아보려 한다

출처 : http://seorenn.blogspot.kr/2014/06/swift-gcdgrand-central-dispatch.html

큐는 여러 종류가 있다. 그 중에 필수적으로 알아둬야 할 큐는 글로벌 큐(Global Queue)와 메인 큐(Main Queue) 이다.
dispatch_get_global_queue() 는 GCD에서 쓰는 큐를 가져오는 함수 중 하나이다. 특히 여기서는 글로벌 큐(Global Queue) 라는걸 가져오기 위한 용도이다. 글로벌큐는 백그라운드로 돌아가는 스레드로 UI와는 별도로 동작한다.
글로벌큐는 큐 중에서도 특이점이 있는데, 글로벌 큐는 작업이 들어오면 즉시 스레드를 생성해서 처리한다. 들어오는 만큼 작업을 무한대로 멀티스레딩 한다는 의미이다. 하지만 다른 큐들은 한 번에 하나씩만 작업을 처리한다.

<예제 코드>

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority, 0)) { 
 // do some task 
 dispatch_async(dispatch_get_main_queue()) { 
  // update some UI 
 } 
}
위 코드를 간단히 설명하자면 global queue에서 작업을 수행하고 main queue에서 UI 변경 작업을 하도록 한 코드다.

댓글 없음:

댓글 쓰기

추천 게시물

애플 개발자 등록방법 2016년 5월 8일 기준!!

애플 개발자 등록 절차 1. 개발자 등록 페이지 이동    애플 개발자 로그인 > Account 페이지 이동 > 하단 영역 클릭 (이미지 참조)   >> Enroll 클릭 >> 무조건 승인!! ...