多线程技术 NSThread & NSOperation & GCD
多线程:在iOS开发中,用到多线程的处理问题的时候有很多,比如异步下载数据时刷新界面等等。
引入多线程来处理问题的关键就是,基于多线程可以使界面更加流畅,防止界面假死。
界面假死:比如你单击一个按钮来开启一个线程,但是这个线程处理的时间是10s,如果你在线程执行完成前再次点击按钮,就会造成一个界面假死的现象,因此引入多线程来处理问题。
1、NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)
以下两个是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ;
2、NSOperation 面向对象的线程技术 ;
3、GCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术,个人认为是iOS系统下的一款基于block实现的多线程技术。
(1).
NSThread创建线程方法:
(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
参数说明:
selector:线程执行的方法,只能有一个参数,不能有返回值
target:selector消息发送的对象
argument:传输给target的唯一参数,也可以是nil
// 成员方法
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo) object:nil];
// 启动start线程
[thread start];
(2).
NSOperation的两个子类
NSInvocationOperation
NSBlockOperation
工作原理:
用NSOperation封装要执行的操作
将创建好的NSOperation对象放NSOperationQueue中
启动OperationQueue开始新的线程执行队列中的操作
注意事项:
使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
使用以下方法可以控制并发的线程数量:
NSOperation 是放入到NSOperationQueue中实现的,这种创建线程的方法是多是给一些不懂多线程的人员开发用的。
下面我简单介绍一下NSOperationQueue:
所谓的NSOperationQueue,虽然名称也是一个Queue(队列),其实实质上本身执行起来并不是严格按照队列的先进先出的顺序执行的,所以我一般称之为线程池,它本身的机制本身就相当于你去银行去办理业务,也许你到银行比较早,但是在你排队的过程中,另外一个人本身比你来的晚,但是你们分别到了不同的服务窗口进行办理业务,而比你到银行晚的那个人办理的业务比较少,而你办理的业务比较多,因此最后他会先办理好离开银行,因此我认为可以理解为NSOperationQueue是一个线程池。
- 比较重要的一点是:用NSOperation创建线程的话,需要返回主线程,返回主线程的方法是:performSelectorOnMainThread:@selector(func) withObject: waitUntilDone:
(3).
有两种方式实现GCD.
第一种 使用线程队列,有两个步骤,
第一步:创建线程队列
第二步:异步执行线程队列
第二种 使用线程组(常用,当线程组中,可以有通知主线程的方法),有三个步骤
第一步:创建线程组
第二步:创建线程队列
第三步:将线程队列放到线程组种,异步执行线程组
第一种方式: 线程队列
/01 创建线程队列
dispatch_queue_t thread=dispatch_queue_create(NULL, NULL);
//02 异步执行线程队列(也就是在,在这个线程队列中,要做什么事)
dispatch_async(thread, ^{
sleep(2);
NSLog(@"休眠2s");
});
//也可以通过 dispatch_get_global_queue(0, 0) 得到闲置的线程队列,如果没有,则会自动创建一个现场队列。
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"休眠2s");
});
第二种方式:线
//01 创建线程组
dispatch_group_t threadGroup=dispatch_group_create();
/02 创建线程队列
dispatch_queue_t t=dispatch_queue_create(NULL, NULL);
//03 将线程队列放入到线程组中,
dispatch_group_async(threadGroup, t, ^{
sleep(2);
NSLog(@"休眠2s");
});
//这里又可使用闲置线程队列
dispatch_group_async(threadGroup, dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"休眠2s");
});
/*
使用线程组有一个好处就是 当线程组的线程队列已经全部执行完毕后 可以通知 主线程
*/
dispatch_group_notify(threadGroup, dispatch_get_main_queue(), ^{
NSLog(@"线程组的线程队列已经全部执行完毕。回到主线程");
});
//验证 是否是线程组中的线程队列全部执行完毕后,才调用 通知的
//经过验证 的确是当线程组中的线程队列全部执行完毕后,才开始 通知
dispatch_group_async(threadGroup, dispatch_get_global_queue(0, 0), ^{
sleep(3);
NSLog(@"休眠3s");
});
多线程技术 NSThread & NSOperation & GCD的更多相关文章
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- 多线程&NSObject&NSThread&NSOperation&GCD
1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...
- iOS多线程开发--NSThread NSOperation GCD
多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...
- 多线程之pthread, NSThread, NSOperation, GCD
关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...
- NSThread/NSOperation/GCD 三种多线程技术
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...
- iOS 多线程(NSThread、GCD、NSOperation)
ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种 ...
- iOS 多线程 简单学习NSThread NSOperation GCD
1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...
- iOS 多线程技术2
iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue a ...
- iOS之多线程开发NSThread、NSOperation、GCD
原文出处: 容芳志的博客 欢迎分享原创到伯乐头条 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Centr ...
随机推荐
- [Python] Keep efficient by vim in Pycharm
From: http://blog.csdn.net/u013088062/article/details/50144201 From: http://blog.csdn.net/u013088062 ...
- 领域实体框架Rafy2 发布了
在2009年我在codeplex发布了1.0版本OpenExpressApp,下载地址:http://openexpressapp.codeplex.com/.OEA 1.0 作为我十多年开发工作的一 ...
- Android注解编程的第一步---模仿ButterKnife的ViewBinder机制
ButterKnife的使用极大方便了Android程序员的开发,实际上,我们可以自己模仿一下实现. 首先就是要了解Java注解的使用. 我们首先要声明一个@interface,也就是注解类: @Ta ...
- node生成自定义命令(yargs/commander)
第一部分可以生成一个自定义命令,例如常见的”express”,yargs和commander则可以在生成的自定义命令上做扩展,yargs将命令扩展成类似express --l xx的形式;而comma ...
- [操作系统实验lab3]实验报告
[感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...
- 强大的修改数据库修改语句ALTER TABLE(一)[20160712]
今天开始的时间比昨天晚,其实午休的时间是差不多的,只是起来后稍微看了一点新闻,10分钟时间就没有了,所以要养成一个好习惯还真不容易,另外就是工作时间少看新闻,太浪费时间. 昨天在执行一个alter S ...
- php多版本管理phpenv
曾经有试过phpbrew的童鞋应该知道有多复杂 虽然这个好久没更新了,还是可以用的-- github:phpenv/phpenv 它的原理就是处理PATH变量,将你要求的php版本的路径加到PATH的 ...
- linux下mysql忘记root密码解决方法
如果使用 MySQL 数据库忘记了root账号密码,可以通过调节配置文件,跳过密码的方式登数据库, 在数据库里面修改账号密码,一般默认的账号是 root 1.编辑 MySQL 配置文件 my.cnf ...
- [python学习笔记]Day2
摘要: 对象 对于python来说,一切事物都是对象,对象基于类创建: 注:查看对象相关成员 var,type,dir 基本数据类型和序列 int内部功能 class int(object): def ...
- 那一夜,我们..奋笔疾书敲出的--->>库存管理系统
说了会再见,最近好吗?无论你在哪里>也许你在温暖的家,或许你在身在异乡的城市;或许你高高的峰顶放生高歌,或许你还在陡峭的山峰半空努力攀爬.......相信我们都会登上顶峰,"会当凌绝顶 ...