GCD之Apply

dispatch_apply函数是dispatch_sync函数和dispatch_group的结合体。该函数将按指定的次数将指定的block追加到指定的dispatch queue中,并等待全部处理结束。

指定的次数将指定的block追加到指定的dispatch queue中,即循环,和dispatch_group类似,此处循环要根据dispatch queue来判读是并行循环还是串行循环。等待全部处理结束,即同步,和dispatch_sync 一样。

下面看代码及运行结果来验证:


dispatch_queue_t queue=  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_apply(5, queue, ^(size_t i) {

        NSLog(@"%ld",i);

    });

    NSLog(@"%d",88);

    //不死锁

    dispatch_async(queue, ^{

        dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {

            NSLog(@"%ld",i);

        });

    });

运行结果:

 

 

此时可以看到:当dispatch queue为全局线程(并行)时输出不是按索引输出,未主线程队列时,按索引输出。

时间: 2024-11-03 06:43:36

GCD之Apply的相关文章

swift版的GCD封装

swift版的GCD封装   说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利.   源码 https://github.com/YouXianMing/Swift-GCD // // GCDQueue.swift // GCD // // http://home.cnblogs.com/u/YouXianMing/ // https://github.com/YouXianMing // // Create

Grand Central Dispatch(GCD)编程基础

有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一种模型. 但是很多时候,在应用开发中,我们会发现本身并没有自己编码去处理一些并发的事件,去开辟新的子线程等等. (虽然一般的调用sdk发起一个网络请求,系统都是会默认给你新起一个线程去处理的). 整个程序看上去基本就是在Main线程中执行. 确实也是这样的一种现象,因为我们基本都是在操作控件的布局,

GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量. 1.首先熟悉下几个函数 dispatch_semaphore_create 创建一个信号量,设置一个初始值 dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1 dispatch_semaphore_wait 等待信号,信号量-1 当

多线程基础(七)GCD线程组+栅栏函数

1.GCD队列组 拦截通知和等待所有任务全部结束在继续往下执行|阻塞 需求:下载两张图片,等两张图片都下载完毕之后,合成图片(这个实例,复习的时候一定要凭空敲出代码练习,好记性不如烂键盘) <两种思路:1.线程组前两个异步函数加载url,最后在拦截函数notify合成 2.在一个子线程中就加载url获取数据,然后合成> 官方规定了,栅栏函数 只能用在调度并发队列中,不能使用在全局并发队列中

javascript技术难点(三)之this、new、apply和call详解

4)    this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一个思路从应用的角度来讲解this指针,从这个角度理解this指针更加有现实意义. 下面我们看看在java语言里是如何使用this指针的,代码如下: public class Person {         private String name;     private String s

call, apply &amp;amp;&amp;amp; bind, currying

简要概括: apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组   --function.apply(thisobj, args) 或者 function.apply(thisobj, args) bind(): 主要作用:将函数绑定到一个对象,返回一个新函数,通过可选的指定参数,作为指定对象的方法调用该方法 --function.bind(o) 或者是function.bind(o, args...); call(): 类似apply,将函数作为指定对象的方法来调用,

js call apply:看看你掌握了js的call和apply没?

群里出了个题:下面弹出的结果是什么 ?var a = function.prototype.call.apply(function (a) {return a}, [0,4,3])alert(a)滚动条到底部查看结果相关链接:关于call和apply结果 是4,下面是过程:先执行apply方法,然后就相当于构造了下面的方法var b = (function(a) {alert(this);//0return a;}).call(0, 4, 3);alert(b)相关应用://巧妙利用functi

apply 方法

  应用某一对象的一个方法,用另一个对象替换当前对象. apply([thisObj[,argArray]]) 参数 thisObj 可选项.将被用作当前对象的对象. argArray 可选项.将被传递给该函数的参数数组. 说明 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError. 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数.

全面理解&amp;#106avascript的caller,callee,call,apply概念

概念 在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function :选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引. 说明 Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类