文档章节

iOS 多线程GCD的简单使用

JoshSone
 JoshSone
发布于 2016/11/13 00:02
字数 883
阅读 48
收藏 0

①什么是线程?什么是进程?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

引用网上一个很形象的例子,一个软件就像一个工厂,工厂里有分管各项职能的车间(进程),但是由于资源等因素限制,同时每次只能有一个车间(进程)工作,但是一个车间里有许多工人(线程),可以由他们中的一个人或由多个人组成一个团队,由这个团队里的人来共同完成一项生产任务,在一个团队(A)进行一项生产任务时,其他团队(B)是无法参与该项生产任务的(此处的内存被A占用)。

②什么是多核?

即多内核(multicore chips)是指在一枚处理器(chip)中集成两个或多个完整的计算引擎(内核)。

再引用网上一个很形象的例子,比如说搬砖,给你100只手,你把这100只手全部装到一个人的身上,那么这就是多核,多核的好处显而易见,肯定比2只手搬砖快,但是缺点就是受限于人本身(CPU),如果重量太大,人的脊柱就会被压断。

③为什么要使用多线程?

比如执行下面这段代码

 for (int i = 0; i < 100000; i++) {
        NSLog(@"i = %d",i);
    }    
    self.view.backgroundColor = [UIColor greenColor];

我们会发现,要在执行循环语句10万次后,才开始执行设置背景颜色的语句,这就是所谓的主线程卡死。

多线程就是让程序在同一时间,执行多个任务。

④多线程的几种方法

(1)NSThread              

特点:代码量大,很麻烦,线程间通信困难不安全

(2)NSOperation

特点:能控制线程间的通信,但不灵活

(3)GCD

特点:调用灵活,线程间通信简单,支持多核且效率最高

一. GCD的原生使用

 //创建子线程
    dispatch_queue_t t=dispatch_queue_create("XIAOBAIGUAN", NULL);
    //async--异步   sync--同步
    dispatch_async(t, ^{
        for (int i = 0; i< 100000;  i++) {
            NSLog(@"i - %d",i);
        }
    });

 二.GCD

https://pan.baidu.com/s/1hr928y4

#import "GCD.h"
//默认子线程
    [GCDQueue executeInGlobalQueue:^{
        //默认子线程中执行代码
        for (int i = 0; i < 30000; i++) {
            printf("aaa\n");
        }
        //UI部分回到主线程中执行
      [GCDQueue executeInMainQueue:^{
        self.view.backgroundColor = [UIColor greenColor];
      }];
    }];

三.GCDGroup多线程组的使用

//初始化
 GCDGroup *group=[GCDGroup new];
//子线程执行,把当前子线程代码规划到一个组
//[GCDQueue globalQueue] - 获取到globalQueue线程  execute-执行
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下载资料1");
        NSLog(@"资料1结束");
    } inGroup:group];
    [[GCDQueue globalQueue]execute:^{
        NSLog(@"下载资料2");
        NSLog(@"资料2结束");
        
    } inGroup:group];
//当Group里面所有成员都执行完,会进入到这个notify方法中
    [[GCDQueue mainQueue]notify:^{
        NSLog(@"开始游戏");
    } inGroup:group];
      
注意:子线程不是顺序执行

四.GCDTimer的使用方法

@property(nonatomic,strong)GCDTimer *timer;
//timeInterval- 时间间隔
//delay       - 首次执行前的延迟
//NSEC_PER_SEC- 一秒
self.timer=[[GCDTimer alloc]initInQueue:[GCDQueue mainQueue]];
////计时器执行的代码
    [self.timer event:^{
        NSLog(@"嘀哒嘀");
    } timeInterval:NSEC_PER_SEC * 3 delay:NSEC_PER_SEC*3];
//开始
 [self.timer start];
//结束后销毁
 [self.timer destroy];

五.GCDSemaphore信息源的使用方法

[GCDQueue executeInGlobalQueue:^{      
        NSLog(@"执行1");      
        //等待命令
        [semaphore wait];    
        NSLog(@"执行3");      
    }];
    
    [GCDQueue executeInGlobalQueue:^{      
      NSLog(@"执行2");
        sleep(5);     
        //发出信号
        [semaphore signal];
        
    }];

这两段代码的执行顺序如下:

© 著作权归作者所有

共有 人打赏支持
JoshSone
粉丝 7
博文 76
码字总数 32794
作品 0
长春
iOS工程师
iOS multiple threads(2)------GCD

前面一二也说过,iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋.同NSThread相比,GCD的运行效率更高,开发更简单。 但GCD确是诱惑力的,因为其本身是...

辉兔狼
2013/03/24
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
(转)直接拿来用!最火的iOS开源项目(二)

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目...

孙启超
2013/06/21
0
1
再看知名应用背后的第三方开源项目

知名应用程序的设计和技术一直都是开发者需要学习的,同样这些应用所使用的开源框架也是不可忽视的一部分。此前《iOS第三方开源库的吐槽和备忘》中作者ibireme列举了国内多款知名应用所使用的...

hejunbinlan
2015/08/18
0
0
iOS奇思妙想之使用block替代通知

前言 iOS开发中,很多情况下会使用到通知,通知的好处很多,但是也有很多坑点,一旦没有管理好,就会造成很多莫名其妙的bug。既然通知使用不当很容易出现问题,那有没有什么办法来避免?经过...

季末微夏
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流量劫持是如何产生的?

流量劫持,这种古老的攻击沉寂了一段时间后,最近又开始闹的沸沸扬扬。众多知名品牌的路由器相继爆出存在安全漏洞,引来国内媒体纷纷报道。只要用户没改默认密码,打开一个网页甚至帖子,路由...

谢思华
9分钟前
0
0
Hadoop Client无法使用maven下载源码

最近在学习hadoop,使用maven的时候想看一下源码的注释,结果IDEA一直提示无法下载 搞得我一度以为maven坏掉了。 但是通过搜索,发现在maven仓库里确实没有源码.... 而2.8.1以及之前的版本是...

Iceberg_XTY
10分钟前
0
0
为什么程序员千万不要重写代码?

你所做的事情,也许暂时看不到成果,但不要灰心或焦虑,你不是没有成长,而是在扎根。 图片来自网络 0 前言 程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的...

Java小铺
12分钟前
0
0
VUE集成AdminLte

1. 安装需要到插件 npm i admin-lte -Snpm i jquery -Snpm i axios -Snpm i vue-router -S 2. 配置webpack.config.js 2.1 module.exports.module.rules修改字体loader: {test: /\.(p......

Pasenger
51分钟前
0
0
Spring Aop原理之切点表达式解析

在前面的文章(Spring AOP切点表达式详解)中,我们总结了Spring Aop切点表达式的用法,而在上文(Spring Aop原理之Advisor过滤)中我们讲到,切点表达式的解析主要是在PatternParser.parse...

爱宝贝丶
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部