iOS多线程GCD入门

本文介绍了iOS开发中的GCD多线程技术,包括队列类型、创建及使用方法,并对比了串行与并行队列的区别。此外,还讲解了系统提供的MainDispatchQueue与GlobalDispatchQueue。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS多线程GCD入门


1.简介

GCD,Grand Central Dispatch,开发者要做的只是1定义想执行的任务2追加到适当的Dispatch Queue中


2.队列Queue

可以理解成几个任务(代码Block)在排队上WC,队伍的种类分成两种:1.Serial Dispatch Queue串行,2.Concurrent Dispatch Queue并行。

串行就是这些任务就只有一个WC,并行是有多个WC。


3.创建队列 dispatch_queue_create

dispatch_queue_t myQueue = dispatch_queue_create("com.test.serialQueue", DISPATCH_QUEUE_SERIAL);
函数的第一个参数是队列名称,调试时会用,不要重名,第二个参数是队列种类。

队列种类有两种:DISPATCH_QUEUE_SERIAL和DISPATCH_QUEUE_CONCURRENT。


4.使用队列(异步使用

异步串行:使用异步串行队列即是生成了一个线程按顺序执行队列中的任务。

串行就好比一个WC,几个任务排队去,先排队的先去,FIFO,一次一个,当人不能两个任务一块进了偷笑

    //异步
    //串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("com.test1.serialQueue",DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(serialQueue, ^{
        NSLog(@"test 1");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 2");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 3");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"test 4");
    });
    
    NSLog(@"test Main");
输出结果为:

2017-02-13 14:17:53.277 UIKitLearn[3937:137154] test Main
2017-02-13 14:17:53.277 UIKitLearn[3937:137199] test 1
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 2
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 3
2017-02-13 14:17:53.278 UIKitLearn[3937:137199] test 4


异步并行:使用异步并行,即是创建多个线程去并列执行队列中的任务,创建的线程数并不一定等于队列中的任务数,因为硬件系统限制,线程数量不是无限多的。

就好比几个任务上WC,一个有仨WC,当然会排成3个线程了。

    //异步
    //并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.test2.serialQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 1");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 2");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 3");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 4");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 5");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 6");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 7");
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"test 8");
    });
    NSLog(@"test Main");
    
输出结果为:
2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 2
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 1
2017-02-13 14:31:01.195 UIKitLearn[4110:143839] test 3
2017-02-13 14:31:01.195 UIKitLearn[4110:143824] test 4
2017-02-13 14:31:01.195 UIKitLearn[4110:143914] test 5
2017-02-13 14:31:01.195 UIKitLearn[4110:143827] test 6
2017-02-13 14:31:01.195 UIKitLearn[4110:143825] test 7
2017-02-13 14:31:01.195 UIKitLearn[4110:143915] test 8
并不想串行那样按顺序执行,我们在中间打个断点:


这里就看到了我们生成的线程,这里要提一点的是,现在版本的iOS,GCD已经加入ARC,如果是老版本的,还要自己release创建的队列。


5.系统标准线程

上面提到的都是我们自己异步添加队列创建的线程,实际上系统会为我们提供几个线程:Main Dispatch Queue 和 Global Dispatch Queue。

Main Dispatch Queue是在主线程中执行的队列,获取方式:

    //获取主线程队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
千万不要阻塞主线程,用户会干死你,老板会开除你,老婆会不要你。


Global Dispatch Queue,是所有应用程序都能够使用的Concurrent Dispatch Queue,其有4个优先级:最高优先级(High Priority),默认优先级(Default Priority),低优先级(Low Priority)和 后台优先级(Background Priority)。

    dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    dispatch_async(globalDispatchQueueLow, ^{
        NSLog(@"low");
    });
    
    dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(globalDispatchQueueHigh, ^{
        NSLog(@"high");
    });
输出结果:

2017-02-13 14:46:13.973 UIKitLearn[4312:152074] high
2017-02-13 14:46:13.973 UIKitLearn[4312:152072] low







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值