iOS 多线程Grand Central Dispatch(GCD)

本文深入探讨了iOS开发中使用DispatchQueue实现异步与并发任务执行的方法,包括串行队列、并发队列、主队列的操作,以及如何通过DispatchGroup管理任务流程和延迟执行任务。

ispatch Queue是一个任务执行队列,可以让你异步或同步地执行多个Block或函数。Dispatch Queue是FIFO的,即先入队的任务总会先执行。目前有三种类型的Dispath Queue:

1.串行队列(Serial dispatch queue)

2.并发队列(Concurrent dispatch queue)

3.主队列(Main dispatch queue)



dispatch_queue_t 为线程队列,该队列有三种类型,主队列,串行队列,并行队列。


串行队列,一次只能执行一个任务,并且按顺序执行。

并行队列,会将队列内的任务并发进行,

主队列,主要是更新ui

1.开启线程
同步开启     dispatch_sync(dispatch_queue_t queue, ^{  })

异步开启      dispatch_async(dispatch_queue_t queue, ^{  })

开启线程后我门需要把要执行的块任务放在队列中去执行,队列dispatch_queue_t

1.1创建队列

 //DISPATCH_QUEUE_SERIAL, DISPATCH_QUEUE_CONCURRENT  创建队列的两种方式

   dispatch_queue_t iqueue =  dispatch_queue_create("a", DISPATCH_QUEUE_SERIAL);//该队列为串行队列 任务在该队列按顺序执行,FIFO原则

  dispatch_queue_t iqueue =  dispatch_queue_create("a", DISPATCH_QUEUE_CONCURRENT);//该队列为并发队列 任务在该队列并发执行
1.2 获取全局的队列,并行队列

 dispatch_queue_t iqueue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

2.开启一个线程,获得全局队列

但是在使用多线程的时候,其实不用刻意的去创建多线程,只需要获得当前的全局线程就可以

优先级

   - DISPATCH_QUEUE_PRIORITY_HIGH:        

   - DISPATCH_QUEUE_PRIORITY_DEFAULT:     

   - DISPATCH_QUEUE_PRIORITY_LOW:         

   - DISPATCH_QUEUE_PRIORITY_BACKGROUND:  

    //开启一个异步任务在并发队列

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        for (int i = 0; i < 5; i++)

        {

            NSLog(@"two  %d",i);

        }


        //回到主线程

        dispatch_async(dispatch_get_main_queue(), ^{

            

        });

    });

3.分发组

将队列中多个任务放在一组进行操作,等全部任务执行完之后响应一个方法

 dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue2, ^{

        for (int i = 0; i < 3000; i++) {

            NSLog(@"----------");

        }

    });

    

    dispatch_group_async(group, queue2, ^{

        for (int i = 0; i < 1500; i++) {

            NSLog(@"======");

        }

    });

    dispatch_group_notify(group, queue2, ^{

        NSLog(@"完成");

    });


4.  //延迟执行

    double delayInSeconds = 2.0;

    //创建一个调度时间,相对于默认时钟或修改现有的调度时间。

    dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(delayInNanoSeconds, dispatch_get_main_queue(), ^{

        NSLog(@"延迟执行 ");

    });

5. 程序中执行一次,多用于单例

 static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

          });




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值