ios-GCD

来源:互联网 发布:mac防火墙设置 编辑:程序博客网 时间:2024/06/06 00:22


  最近几天对IOS的GCD敢兴趣了,所以做点记录 :

1:GCD在IOS6之后,是开启了自动计数的,之前需要使用 dispatch_retain 和 dispatch_release来手动计数,所以我们在高版本需要手动计数的时候,需要加入

-DOS_OBJECT_USE_OBJC=0 到编译选项。


2:常用函数

dispatch_queue_t dispatch_get_global_queue(

   long priority,

   unsigned long flags);

获得一个有优先级的常用并行queue,如果你的多个任务在同一个优先级的queue中,那么他们可能会被同时执行。


priority有

#define DISPATCH_QUEUE_PRIORITY_HIGH        2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT     0

#define DISPATCH_QUEUE_PRIORITY_LOW         (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND  INT16_MIN

高优先级总是比低优先级先执行。


dispatch_queue_t dispatch_get_main_queue(void);

获得程序主线程的串行序列queue,这个queue是程序自动回创建的,要注意使用这个queue,他会导致主线程执行其他任务的延时,影响界面刷新,显示


dispatch_queue_t dispatch_queue_create(

   const char *label

   dispatch_queue_attr_t attr);

创建一个queue来执行block,label必须是唯一的,推荐使用反序DNS来设置 ,比如“com.xxxx.www”

attr:

在ios 4.3后

DISPATCH_QUEUE_SERIAL 或 NULL 创建一个串行queue

DISPATCH_QUEUE_CONCURRENT 创建一个并行queue

在ios4.3前,只能输入NULL

不管串行还是并行queue,都是先进先出的来执行block,不同的是串行queue会在一个block执行完成后再执行下个block,并行queue会在系统资源充分的情况下同时执行几个block的代码


dispatch_queue_t dispatch_get_current_queue(

   void);

取得当前运行代码的queue,这个函数的返回绝对不会是NULL,这个函数会被废弃,不建议使用。


const char * dispatch_queue_get_label(dispatch_queue_t queue);

取得当前运行代码的queue在创建时的Lable。


void dispatch_set_target_queue(

   dispatch_object_t object,

   dispatch_queue_t queue);

用来改变queue的一些属性,比如优先级,Sispatch sources和dispatch I/O channels



void dispatch_main(void);

这个函数很难让人理解,这是文档描述:

Return Value

This function never returns.

Discussion

This function "parks" the main thread and waits for blocks to be submitted to the main queue. Applications that call UIApplicationMain (iOS), NSApplicationMain (OS X), or CFRunLoopRunon the main thread must not call dispatch_main.


我在主线程执行这个函数后,程序被挂起,在其他queue执行这个程序后报错,我的理解是这个函数是为了实现我们自己的消息循环,但是在ios开发的框架中,已经有了UIApplicationMain和CFRunLoopRun2个函数,所以我们一般不需要使用这个函数来进行操作。


void dispatch_once(

   dispatch_once_t *predicate,

   dispatch_block_t block);

在程序的生命周期累,表示为predicate中的block代码只能被执行1次,这个函数我们可以看见在单件模式中被使用


 void dispatch_async(

   dispatch_queue_t queue,

   dispatch_block_t block);

提交一个block代码到指定queue去,理解返回,系统会在适当的时候执行block的代码,好多并行代码就是这样提交执行的


void dispatch_async_f(

   dispatch_queue_t queue,

   void *context,

   dispatch_function_t work);

在指定的queue中执行一段C函数,立即返回,函数参数通过context传递


void test_c(){    printf("c language test");}-(void)test{dispatch_async_f(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), 0, test_fun);}


void dispatch_barrier_async(

   dispatch_queue_t queue,

   dispatch_block_t block);

这个是为了分段执行block代码的一个函数,比如我们有10个block分发在一个并发queue中执行,我们并不能掌控这个10个block执行完成的顺序,

但是我们现在有个需求,前5个block执行完成后才能开始后5个block的执行,我们就会用到这个函数,

原代码

dispatch_async(queue,block1);...dispatch_async(queue,block6);...dispatch_async(queue,block10);


满足需求的代码

dispatch_async(queue,block1);...dispatch_barrier_async(queue,block6);...dispatch_async(queue,block10);


The queue you specify should be a concurrent queue that you create yourself using the dispatch_queue_create function. If the queue you pass to this function is a serial queue or one of the global concurrent queues, this function behaves like the dispatch_async function.

注意,这个函数的queue需要是一个自己创建的并发queue,否则没有效果


dispatch_sync 

这个函数系列和dispatch_async一样,只是程序会在提交block的地方等待,直到block代码执行完成,才会继续往下执行后续代码


void dispatch_after(

   dispatch_time_t when,

   dispatch_queue_t queue,

   dispatch_block_t block);

在指定时间后执行block代码,这个很好理解


group例子

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);    dispatch_group_t group = dispatch_group_create();//    dispatch_group_enter(group);    dispatch_group_async(group,queue,^{        sleep(3);//        dispatch_group_leave(group);    });//    dispatch_group_enter(group);    dispatch_group_async(group,queue,^{        sleep(5);//        dispatch_group_leave(group);    });    dispatch_group_notify(group,queue,^{        NSLog(@"group end");    });

关于GCD常用的操作就这么多了,后续有时间,在来看和data I/O相关的等等函数



0 0
原创粉丝点击