iOS 多线程 GCD

2017-01-30  本文已影响52人  哎呀我Qu
1、什么是 GCD ?

GCD 是苹果公司为多核的并行运算提出的解决方案,它基于 C 语言,全称 Grand Central Dispatch,有人叫它“牛逼的中心调度”。

2、GCD 用途

通过 GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加代码块即可,GCD 在后端管理着一个线程池。GCD 不仅决定着你的代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。这样可以将开发者从线程管理的工作中解放出来,通过集中的管理线程,来缓解大量线程被创建的问题。

GCD 带来的另一个重要改变是,作为开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用。

首先,系统提供给你一个叫做 主队列(main queue) 的特殊队列。和其它串行队列一样,这个队列中的任务一次只能执行一个。然而,它能保证所有的任务都在主线程执行,而主线程是唯一可用于更新 UI 的线程。这个队列就是用于发生消息给 UIView 或发送通知的。

系统同时提供给你好几个并发队列。它们叫做 全局调度队列(Global Dispatch Queues) 。目前的四个全局队列有着不同的优先级:background、low、default 以及 high。要知道,Apple 的 API 也会使用这些队列,所以你添加的任何任务都不会是这些队列中唯一的任务。

最后,你也可以创建自己的串行队列或并发队列。这就是说,至少有五个队列任你处置:主队列、四个全局调度队列,再加上任何你自己创建的队列。

3、GCD 术语
4、GCD 优点
5、GCD 使用
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
    NSLog(@"1");
});
dispatch_async(mainQueue, ^{
    NSLog(@"2");
});
dispatch_async(mainQueue, ^{
    NSLog(@"3");
});
dispatch_async(mainQueue, ^{
    NSLog(@"4");
});
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
    NSLog(@"1");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"2");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"3");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"4");
});
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
    NSLog(@"4");
    dispatch_sync(concurrentQueue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"5");
    });
    NSLog(@"6");
});
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSLog(@"onceToken");
});
double delayInSeconds = 2.0;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, mainQueue, ^{
    NSLog(@"延时执行的2秒");
});
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultQueue, ^{
    [NSThread sleepForTimeInterval:3];
    NSLog(@"1");
});
dispatch_group_async(group, defaultQueue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"2");
});
dispatch_group_notify(group, defaultQueue, ^{
    NSLog(@"3");
});
    //    等价于    
//    dispatch_group_enter(group);
//    dispatch_async(defaultQueue, ^{
//
//        NSLog(@"1");
//        dispatch_group_leave(group);
//    });
dispatch_queue_t queue = dispatch_queue_create("barrierExecute", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"1");
});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:4];
    NSLog(@"2");
});
dispatch_barrier_async(queue, ^{
    NSLog(@"3");
    [NSThread sleepForTimeInterval:4];
    
});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@"4");
});
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(5, defaultQueue, ^(size_t i) {
        NSLog(@"%lu",i);
});
上一篇 下一篇

猜你喜欢

热点阅读