我们知道遍历数组是一个相对耗时的操作,而同时手机的核是越来越多,所以我们需要充分利用iOS多核的作用.

特别是在遍历操作中还有其他耗时操作.像我们平时直接遍历数组的操作

for (NSInteger i= ,i< ,i++){

 //do something

 } 

这样的代码不会随着手机的不断升级而提高效率.

但是利用GCD可以实现充分利用多核.并且随着手机不断升级,同样的代码,执行效率会自动提高,十分OK.下面提供两种常用方法.

NSArray * arr = @[@"",@"",@"",@"",@""];

   dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

   dispatch_group_t group =  dispatch_group_create();

    for (NSInteger i = ; i < arr.count; i++) {

        NSLog(@"%ld",(long)i);

        dispatch_group_async(group, queue, ^{

            sleep();

            NSLog(@"%ld -- %@",(long)i,[NSThread currentThread]);

        });

    }

    //dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// 等待queue任务执行完,才往下走;

    dispatch_group_notify(group, queue, ^{ // 往下走,回调block

        NSLog(@"group end");

    });

NSLog(@"end”);

2016-07-26 15:59:09.566 学习之路[4448:1770686] 0

2016-07-26 15:59:09.566 学习之路[4448:1770686] 1

2016-07-26 15:59:09.566 学习之路[4448:1770686] 2

2016-07-26 15:59:09.567 学习之路[4448:1770686] 3

2016-07-26 15:59:09.567 学习之路[4448:1770686] 4

2016-07-26 15:59:09.567 学习之路[4448:1770686] end

2016-07-26 15:59:14.569 学习之路[4448:1772333] 4 -- <NSThread: 0x7fc412631120>{number = 6, name = (null)}

2016-07-26 15:59:14.569 学习之路[4448:1772330] 1 -- <NSThread: 0x7fc4124bf8e0>{number = 2, name = (null)}

2016-07-26 15:59:14.569 学习之路[4448:1771326] 0 -- <NSThread: 0x7fc4126255e0>{number = 3, name = (null)}

2016-07-26 15:59:14.569 学习之路[4448:1772332] 3 -- <NSThread: 0x7fc41261d900>{number = 5, name = (null)}

2016-07-26 15:59:14.569 学习之路[4448:1772331] 2 -- <NSThread: 0x7fc4124bb230>{number = 4, name = (null)}

2016-07-26 15:59:14.570 学习之路[4448:1772331] group end

dispatch group 只能异步,并且不会在主线程走任务

NSArray * arr = @[@"",@"",@"",@"",@""];

dispatch_apply([arr count], dispatch_get_global_queue(, ), ^(size_t index) {

        sleep();

        NSLog(@"%@ %@",arr[index],[NSThread currentThread]);

    });

NSLog(@"end”);

它以指定的次数将指定的Block加入到指定的队列中,并等待队列中操作全部完成,NSLog(@"end”)在上面任务执行完才会执行

2016-07-26 16:00:58.106 学习之路[4463:1787375] 2 <NSThread: 0x7f98fa61aff0>{number = 4, name = (null)}

2016-07-26 16:00:58.106 学习之路[4463:1787363] 3 <NSThread: 0x7f98fa61e680>{number = 2, name = (null)}

2016-07-26 16:00:58.106 学习之路[4463:1787587] 4 <NSThread: 0x7f98fa747a00>{number = 3, name = (null)}

2016-07-26 16:00:58.106 学习之路[4463:1787047] 1 <NSThread: 0x7f98fa402c30>{number = 1, name = main}

2016-07-26 16:00:59.110 学习之路[4463:1787375] 5 <NSThread: 0x7f98fa61aff0>{number = 4, name = (null)}

2016-07-26 16:00:59.110 学习之路[4463:1787047] end

 

dispatch apply 是同步的,可以在主线程走任务,如果想异步可以在外面包一层

    NSArray * arr = @[@"",@"",@"",@"",@""];

  dispatch_async(dispatch_get_global_queue(, ), ^{

      dispatch_apply([arr count], dispatch_get_global_queue(, ), ^(size_t index) {

          sleep();

          NSLog(@"%@ %@",arr[index],[NSThread currentThread]);

      });

  });

    NSLog(@"end");

}
但是这样效果就和dispatch group一样了,不会在主线程走任务

iOS开发——高级篇——多线程dispatch_apply的更多相关文章

  1. iOS开发——高级篇——多线程的安全隐患

    资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题   一.解 ...

  2. iOS开发——高级篇——多线程GCD死锁

    面试题 请问以下代码打印结果: - (void)interview01 { // 以下代码是在主线程执行的 NSLog(@"执行任务1"); dispatch_queue_t qu ...

  3. iOS开发网络篇—多线程断点下载

    iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  4. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

  5. iOS开发——高级篇——iOS开发之网络安全密码学

    一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...

  6. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  7. iOS开发——高级篇——地理定位 CoreLocation

    一.CoreLocation 在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用 ...

  8. iOS开发——高级篇——地图 MapKit

    一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用中,都用到了定位 ...

  9. iOS开发——高级篇——iOS 项目的目录结构

    最近闲来无事去面试一下iOS开发,让我感到吃惊的,面试官竟然问怎么分目录结构,还具体问每个子目录的文件名. 目录结构确实非常重要,面试官这么问,无疑是想窥探开发经验.清晰的目录结构,可让人一眼明白相应 ...

随机推荐

  1. centos7下安装Python3.7(与python2共存)

    2019-01-22   22:50:05 centos7默认安装的是python2.7,然而python2基本上要淘汰了,所以有必要安装最新的python3 python,g++这些工具一般安装在/ ...

  2. LeetCode07--整数反转

    ''' 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 ...

  3. 【Codeforces 1006D】Two Strings Swaps

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 注意只能改变a不能改变b 然后只要让a[i],b[i],a[n-i-1],b[n-i-1]这4个字符能凑成两对.全都一样就可以了 分类讨论下就 ...

  4. hdu 2063最大匹配

    #include<stdio.h> #include<string.h> int link[600],mark[600],map[600][600],m,n; int find ...

  5. [转]Android SDK下载和更新失败的解决方法

    今天更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetched ...

  6. [NOIP1998] 提高组 洛谷P1012 拼数

    题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...

  7. 【2018 Multi-University Training Contest 2】

    01: 02: 03: 04:https://www.cnblogs.com/myx12345/p/9394511.html 05: 06: 07:https://www.cnblogs.com/my ...

  8. BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯

    n<=400个东西,每个东西有高度<=100,这种东西在堆放过程中不得超过的最大高度<=40000,以及每个东西的个数<=10,求最高能堆多高. 算了下背包复杂度不太对然后开了 ...

  9. python监控tomcat日记文件

    最近写了一个用python监控tomcat日记文件的功能 实现的功能: 监控日记文件中实时过来的记录,统计每分钟各个接口调用次数,统计结果插入oracle #!/usr/bin/python # -* ...

  10. 微软2016校园招聘在线笔试 B Professor Q's Software [ 拓扑图dp ]

    传送门 题目2 : Professor Q's Software 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new s ...