iOS多线程编程之Grand Central Dispatch(GCD)

GCD的工作原理:

让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务(比如一个函数).

GCD中的队列称为dispatch queue,它可以保证先进来的任务先得到执行
dispatch queue又分为三种:

Serial      

又称为private dispatch queues,同时只执行一个任务。所以也可以创建多个Serial queue,它们各自是同步执行的,但Serial queue之间是并发执行的。

Concurrent

又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。

Main dispatch queue

它是全局可用的serial queue,它是在应用程序主线程上执行任务的(UI线程:程序打开的第一个页面)。

常用的几种方法:

1.dispatch_async

为了避免界面在处理耗时的操作时卡死,比如读取网络数据,数据库读写等,会在另外一个线程中处理这些操作,然后通知主线程更新界面。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 耗时的操作 比如下载图片 
    dispatch_async(dispatch_get_main_queue(), ^{  
        // 通知主线程更新界面  
    });  
});  

2、dispatch_group_async

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
dispatch_group_t group = dispatch_group_create();  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:1];  
    NSLog(@"one");  
});  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:2];  
    NSLog(@"two");  
});  
dispatch_group_async(group, queue, ^{  
    [NSThread sleepForTimeInterval:3];  
    NSLog(@"three");  
});  
dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
    NSLog(@"UI");  
});  
dispatch_release(group);  

 根据上面代码执行之后的结果是:one 、two、three、UI

因为只有前三个任务完成之后才会执行最后一个任务。

3、dispatch_barrier_async

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。

dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:2];  
    NSLog(@"dispatch_async_one");  
});  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:4];  
    NSLog(@"dispatch_async_two");  
});  
dispatch_barrier_async(queue, ^{  
    NSLog(@"dispatch_barrier_async");  
    [NSThread sleepForTimeInterval:4];  
  
});  
dispatch_async(queue, ^{  
    [NSThread sleepForTimeInterval:1];  
    NSLog(@"dispatch_async_three");  
});  

最终输出的顺序为dispatch_async_one、dispatch_async_two、dispatch_barrier_async、dispatch_async_three

 

猜你喜欢

转载自1395014506.iteye.com/blog/2258676