当前位置:首页 > Windows程序 > 正文

【读书笔记】GCD

2021-03-24 Windows程序

一,Dispatch Queue

dispatch_async(queue, ^{ /* *想执行的任务 */ });

 

其中queue分为两种:

1,Serial Dispatch Queue 等待现在执行中处理结束。

2,Concurrent Dispatch Queue 不等待现在执行中处理结束。

 

二,dispatch_queue_create

用于生成queue.

1,生成Serial Dispatch Queue.

dispatch_queue_t mySerialDispatchQueue=dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);

2,生成Concurrent Dispatch Queue。

dispatch_queue_t myConcurrentDispatchQueue=dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

3,用法

dispatch_queue_t myConcurrentDispatchQueue=dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConcurrentDispatchQueue, ^{ NSLog(@"block on myConcurrentDispatchQueue"); });

 

三,Main Dispatch Queue/Global Dispatch Queue

1,Main Dispatch Queue. 

在主线程中执行的Dispatch Queue.

//Main Dispatch Queue的获取方法 dispatch_queue_t mainDisaptchQueue=dispatch_get_main_queue() ;

 

2,Global Dispatch Queue.

在所有应用程序中都能够使用的Dispatch Queue.它有4个优先级。

//Global Dispatch Queue的获取方法 //高优先级 dispatch_queue_t globalDispatchQueueHigh=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); //默认优先级 dispatch_queue_t globalDispatchQueueDefault=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //低优先级 dispatch_queue_t globalDispatchQueueLow=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //后台优先级 dispatch_queue_t globalDispatchQueueBackground=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

3,用法

//在默认优先级的Global Dispatch Queue中执行block dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ /* *可并行执行的处理 */ dispatch_async(dispatch_get_main_queue(), ^{ /* *只能在主线程中执行的处理 */ }); });

 

四,dispatch_set_target_queue

用于变更Dispatch Queue的生成。

//在后台执行动作处理的Serial Dispatch Queue的生成方法 dispatch_queue_t mySerialDispatchQueue=dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL); dispatch_queue_t globalDispatchQueueBackground=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);

 

五,dispatch_after

 指定时间后执行处理。

1,ull是C语言的数值字面量,是显示表示类型时使用的字符串(表示“unsigned long long ”)。如果使用NSEC_PER_MSEC则可以以毫秒为单位计算。如果使用NSEC_PER_SEC则为毫微秒的数值。

2,dispatch_time_t计算相对时间。dispatch_walltime用于计算绝对时间。

 

在3秒后将指定的Block追加到Main Dispatch Queue.

dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC); dispatch_after(time, dispatch_get_main_queue(), ^{ NSLog(@"waited at least three seconds."); });

 

六,Dispatch Group

无论向什么样的Dispatch Queue中追加处理,使用Dispatch Group都可以监视这些处理执行的结束。一旦检测到所有执行结束,就可将结束的处理追加到Dispatch Queue中。这就是使用Dispatch Group的原因。

 

1,追加3个Block到Global Dispatch Queue,这些Block如果全部执行完毕,就会执行Main Dispatch Queue中结束处理用的Block.

 

//追加3个Block到Global Dispatch Queue,这些Block如果全部执行完毕,就会执行Main Dispatch Queue中结束处理用的Block. 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(@"blk0"); }); dispatch_group_async(group, queue, ^{ NSLog(@"blk1"); }); dispatch_group_async(group, queue, ^{ NSLog(@"blk2"); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"done"); });

 

2,在Dispatch Group中使用dispatch_group_wait函数等待全部处理执行结束。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66853.html