Objective C 高级进阶 — GCD队列浅析(二)

前边讲解了如何创建GCD队列,下边接着来讲解如何执行一个队列, 请看官方原文

dispatch_async
Submits a block for asynchronous execution on a dispatch queue and returns immediately.

   void dispatch_async(
   dispatch_queue_t queue,
   dispatch_block_t block);
Parameters
queue
The queue on which to submit the block. The queue is retained by the system until the block has run to completion. This parameter cannot be NULL.
block
The block to submit to the target dispatch queue. This function performs Block_copy and Block_release on behalf of callers. This parameter cannot be NULL.
Discussion
This function is the fundamental mechanism for submitting blocks to a dispatch queue. Calls to this function always return immediately after the block has been submitted and never wait for the block to be invoked. The target queue determines whether the block is invoked serially or concurrently with respect to other blocks submitted to that same queue. Independent serial queues are processed concurrently with respect to each other.

Availability
Available in iOS 4.0 and later.
Declared In
dispatch/queue.h
下边先来简单解释一下基本定义:

dispatch_async 提交一个异步执行的block到一个dispatch队列,并且立即执行,大家注意,在这里可能大家会存在理解上的误区,这里准确的理解是提交一个异步执行的block到一个dispatch队列,而不是提交一个block到一个异步执行的dispatch队列。一定要注意这里的区别。后边我会添加代码演示,看完演示之后大家都会清楚了。

参数就不讲解了,下边来看讨论部分:这个函数的基本结构是提交一个block到dispatch queue. 调用这个方法总是在提交完成block并且block没有执行之前立即返回。(注意下边的话),目标队列决定了block是否是串行执行还是并行执行。独立的串行队列是并行去处理的。

好了,到这里大家可能稍微理解了一些,下边来看具体代码讲解:


这里我先创建了一个并行队列,然后通过dispatch_async异步加载block的方式加入到该队列中,编译,运行,分析运行结果如下:

NSLog(@"dispatch_async is invoked done")先打印出来,说明dispatch_async是在block提交之后运行之前立即返回的,block里边的log是异步打印的,执行打印的顺序是变动的。

再来看:


这里我又创建了一个serial的队列,同样的把dispatch_async添加进去。编译,运行,看分析结果:

不管我运行多少次,block里的log都是顺序打印出来的, 注意看 “dispatch_async is invoked done”为什么没有先打印出来呢?文档里不是说在block之前立即返回吗?应该先打印这句才对啊,是的,没错,这里跟大家解释一下,细心的同学会发现“dispatch_async is invoked done”打印出来的时间是2013-07-03 13:00:14:051, 与"this is a block 1"时间一样,但比其他NSLog时间早,而却放在了其他log的后边。其实这是由于xCode的打印机制造成的,有时候不要太相信自己的眼睛,依据事实判断才能发现真相。

好了,通过打印的时间我们可以准确的判断,dispatch_async是有限返回的,然后再去执行block函数。

理解了dispatch_async之后,那么再去理解dispatch_async_f等等以后的方法都会特别简单了,原理和机制都是一样的

来看dispatch_async_f的代码实例运行图:


这里就不详细解释了,简单说一下吧,dispatch_async_f是通过传递一个自定义的callback函数,并能把任意类型的参数传递到callback中的一个异步队列方法,demo中就是把一个NSString作为context参数传递到自定义的callback中去的。到此相信大家都理解的很透彻了吧:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值