多线程:在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的更多相关文章

  1. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  2. 多线程&NSObject&NSThread&NSOperation&GCD

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...

  3. iOS多线程开发--NSThread NSOperation GCD

    多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...

  4. 多线程之pthread, NSThread, NSOperation, GCD

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...

  5. NSThread/NSOperation/GCD 三种多线程技术

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  6. iOS 多线程(NSThread、GCD、NSOperation)

    ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种 ...

  7. iOS 多线程 简单学习NSThread NSOperation GCD

    1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...

  8. iOS 多线程技术2

    iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue a ...

  9. iOS之多线程开发NSThread、NSOperation、GCD

    原文出处: 容芳志的博客   欢迎分享原创到伯乐头条 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Centr ...

随机推荐

  1. SharePoint 2013中的爬网最佳做法

    了解在 SharePoint Server 2013 中爬网的最佳做法 搜索系统对内容进行爬网,以构建一个用户可以对其运行搜索查询的搜索索引.本文包含有关如何最有效地管理爬网的建议. 本文内容: 使用 ...

  2. 利用 word2vec 训练的字向量进行中文分词

    最近针对之前发表的一篇博文<Deep Learning 在中文分词和词性标注任务中的应用>中的算法做了一个实现,感觉效果还不错.本文主要是将我在程序实现过程中的一些数学细节整理出来,借此优 ...

  3. 20款优秀的国外 Mobile App 界面设计案例

    在下面给大家分享的移动应用程序界面设计作品中,你可以看到不同创意类型的视觉效果.如果你想获得灵感,那很有必要看看下面20个优秀用户体验的移动应用 UI 设计.想要获取更多的灵感,可以访问移动开发分类, ...

  4. IOS开发中设置控件内容对齐方式时容易混淆的几个属性

    IOS开发中四个容易混淆的属性: 1. textAligment : 文字的水平方向的对齐方式 1> 取值 NSTextAlignmentLeft      = 0,    // 左对齐 NST ...

  5. OpenProcess打开进程返回错误的问题

    问题描述 项目中需要做一个小功能:能够查看系统中当前正在运行的进程的内存信息,如内存块类型.分配状态.访问权限等.如下图所示: 需要的信息和上图相差无几.说起来也不算太难,毕竟现成的API已经提供了. ...

  6. Node.js爬虫数据抓取 -- 问题总结

    一  返回的信息提示  Something went wrong  request模块请求出现未知错误 其中,所用代码如下(无User-Agent部分) 问题多次派查无果,包括: 1:postman请 ...

  7. 2015年百度之星初赛(1) --- C 序列变换

    序列变换 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. Worm.Win32.DownLoader.ns病毒主进程新式输入法注入分析(IME Inject)

    1.病毒会在system32目录生成一个以tmp结尾的随机数命名的文件. 2.然后挂钩HOOK本进程空间的imm32.dll导出的ImmLoadLayout函数和ntdll.dll导出的ZwQuery ...

  9. Winform屏幕截图保存C#代码

    代码如下: using System.Runtime.InteropServices; using System.Drawing.Imaging; [System.Runtime.InteropSer ...

  10. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...