iOS多线程GCD入门

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

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







六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程求解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的应用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的应用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值