DirTy™의 하루일과/DirTy™의 가당찮은iOS

[IOS] GCD on Many Tasks

DirTy™ 2016. 5. 13. 11:07

예전 코드들을 보다가 로그인 관련 코드를 쭉 보았다.

http 요청을 총 4번을 보내는데 이때는 iOS에 무지한 시절이라

1번 작업이 끝나면 2번 작업 호출. 2번 작업이 끝나면 3번 작업 호출. 3번 작업이 끝나면 4번 작업 호출.


위의 방식도 틀린 작업은 아니지만 GCD에서는 dispatch_groups 라는 것을 제공 한다.

이를 사용하면 쉽고 간단하게 백그라운드에서 작업을 진행 할 수 있다.


아래와 같이 그룹을 생성 할수 있다.

dispatch_group_t group = dispatch_group_create();


dispatch_group에 작업을 추가하는 방법은 두가지가 있다.

아래와 같이 하면 작업은 자동으로 관리된다.

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{


});


수동으로 관리도 가능하다.

dispatch_group_enter(group);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT), 0), ^{

dispatch_group_leave(group);

});


모든 작업을 마치면 아래로 비동기로 통지가 날라온다.

dispatch_group_notify(group, dispatch_get_main_queue(), ^{


});


모든 작업을 마치기 까지 동기로 기다리고 싶으면 아래의 구문을 사용하면된다.

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);


결론적으로 비동기로 그룹 작업 처리를 하고싶으면 아래와 같이 하면된다.

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"Block1");

[NSThread sleepForTimeInterval:1.0];

NSLog(@"Block1 End");

});


dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"Block2");

[NSThread sleepForTimeInterval:1.0];

NSLog(@"Block2 End");

});


dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSLog(@"Block3");

[NSThread sleepForTimeInterval:1.0];

NSLog(@"Block3 End");

});


dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"all Blocks End notify");

});