iOS 开发中,多线程编程GCD的常用方法总结

本文详细介绍了GCD在iOS开发中的应用,包括如何实现单例、定时器、执行方法N次等常见功能,并阐述了GCD相较于NSThread的简单易用、效率高及性能优越的优势。

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

          无论从事Android还是iOS开发,作为一个优秀的软件研发人员,对界面的操作能体现他的代码量,然而,对编程思想的理解还是体现在对底层接口的理解上,多线程编程则是无法回避的一个编程要点。然而,多线程编程入门比较容易,一般代码量不大,但是要深入理解难度却不小。iOS开发以Mac OS X 10.6 ,iOS 4为分界线,推出了GCD。

    所谓GCD,即 Grand central Dispatch,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。注意:GCD并不是Cocoa框架的一部分。

    很多人会问为什么要使用GCD?问的好,GCD的优势:

    1、简单易用。NSThread的难用我在这里就不吐槽了。你们可以自己体会下。详情见:点击打开链接

    2、效率高。为什么GCD易用呢,还是牵扯到效率问题。因为开发者不需要操心效率问题;

    3、性能优越。GCD自动根据系统负载增减线程数。这就减少了上下文切换,增加了计算效率。

    使用GCD的场合:在ios 4.0+以上系统均可以使用,目前程序开发基本上不会考虑ios 4.0以下的系统了吧。

    GCD中有3中队列类型,分别是:主队列,全局队列,自定义的队列。

    队列主要分为:串行队列、并发队列。

    GCD中的串行队列有:主队列、自定义队列

        //主队列
        dispatch_queue_t queque = dispatch_get_main_queue();
        //自定义队列
        dispatch_queue_t queue = dispatch_queue_create("com.abc.tcsl", NULL);
    GCD中的并发队列有: 全局队列。

        //并发队列
        dispatch_queue_t quequet = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   下面,开始介绍GCD的常用方法,经过测试,特别好用啊。 得意 得意

    首先,GCD可以写单例: (返回Teacher的单例)

+ (instancetype) getInstanceType;
{
    static Teacher * teacher;
    static dispatch_once_t  onceToke;
    dispatch_once(&onceToke, ^{
        teacher = [[Teacher alloc] init];
    });
    return teacher;
}
    GCD可以实现一个定时器:

//GCD定时器
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
        //每2秒触发一次  误差是 0秒
        dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2ull * NSEC_PER_SEC, 0);
        dispatch_source_set_event_handler(timer, ^{
            
            dispatch_source_set_event_handler(timer, ^{
                NSLog(@"wark up!!");
                 //取消计时器
                dispatch_source_cancel(timer);
                //关闭文件描述符
                dispatch_source_set_cancel_handler(timer, ^{
                    NSLog(@"Cancel the task");
                });
            });
        });
        //启动多线程
        dispatch_resume(timer);
        [[NSRunLoop currentRunLoop] run];
     其中,这句代码取消了定时器可以无限循环。
dispatch_source_cancel(timer);

     GCD还可以让某一个block执行N次,简直是神器啊!

//执行某个方法N次
        dispatch_apply(N, dispatch_get_global_queue(0,0), ^(size_t index)
                       {
                           [teacher noticeTeacher];
                       });
    GCD队列可以暂停,可以恢复,但是对主队列无效!

  队列暂停: dispatch_suspeng(queue);

  队列恢复: dispatch_resume(queue); 没错,启动定时器也是用的这句。

  GCD实现多线程的并发控制:

//实现多线程的并发控制
        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, ^{
            NSLog(@"A事件开始执行");
        });
        dispatch_group_async(group, queue, ^{
            NSLog(@"B事件开始执行");
        });
        dispatch_group_notify(group, queue, ^{
            NSLog(@"通知主线程开始执行任务");
        });
        [[NSRunLoop currentRunLoop] run];
执行结果:

 2014-05-13 16:07:38.559 GCD[1198:1603] B事件开始执行
 2014-05-13 16:07:38.559 GCD[1198:1203] A事件开始执行
 2014-05-13 16:07:38.561 GCD[1198:1203] 通知主线程开始执行任务


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值