◎위챗 : speedseoul
http://seorenn.blogspot.com/2012/04/ios.html
특정 API를 호출했는데 이 API가 작업시간이 오래 걸린다면 UI가 그 동안 멈추는 현상이 발생한다. 예를 들자면 대용량 파일을 읽거나 쓸 때 그 동안은 UI가 동작하지 않는 경우가 있다. 이 문제를 회피하려면 오래 걸리는 작업을 비동기(Asynchronous)로 처리하도록 할 수 있다.
이런 경우를 위해서 애플이 만든 GCD(Grand Central Dispatch)라 불리우는 기술(개념?)을 이용 할 수 있다. 쓰레드로 분리된 큐에 작업 내용을 넣어서 이를 차례대로 실행시키는 방식으로, 백그라운드 프로세싱과 병렬 처리를 한방에 해결 할 수 있도록 해 주는 고마운 기능이다.
우선 가정부터. heavyOperatingMethod라는 메서드가 작업 시간이 오래 걸리지만 UI는 이 메서드가 리턴하는 값을 이용해야 한다. 하지만 heavyOperatingMethod의 응답을 기다리기에는 UI가 그냥 멈춰버리기 때문에 사용자에게서 불만이 생길 것 같다. 이 경우 heavyOperatingMethod를 비동기로 처리해보자. 아래 코드는 그 예제 코드이다.
// 여기서부터 비동기 코드 시작.
// dispatch_async 함수는 내부블럭의 코드 실행에 영향을 받지 않고 바로 실행이 끝난다.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 작업이 오래 걸리는 API를 백그라운드 스레드에서 실행한다.
BOOL res = [self heavyOperatingMethod];
dispatch_async(dispatch_get_main_queue(), ^{
// 이 블럭은 메인스레드(UI)에서 실행된다.
if (res) {
[self operationSucceed];
} else {
[self operationFailed];
}
});
});
위 코드 예제는 앞서 이야기한 GCD(Grand Central Dispatch)라 불리우는 기술을 이용한 것이다.