iOS多线程技术
iOS多线程技术主要分配NSThread、NSOperation和GCD。下边来简单的介绍一下吧。
随性一点,就不按照顺序来了。所以先介绍一下NSOperation。
------------------------------------------------------------------------------NSOperation------------------------------------------------------------------------------
NSBlockOperation:
它是NSOperation的一个具体的子类,它管理着并发执行的一个或者多个块操作。你可以使用这个对象一次执行多个连续的块,而没有必要去为每一个操作创建分开的操作对象。当执行超过一个block时,操作自己在所有块执行完毕后结束。
NSInvocationOperation:
它是NSOperation的一个具体子类,它管理执行一个单独的封装的任务作为一个调用。你可以使用这个类开始一个调用指定对象的选择器操作。这个类实现的是非并发操作。
NSOperationQueue:
该类控制一套NSOperation对象的执行。当把operation添加到队列,它会一直存在在该队列中,直到确信它取消或者结束执行它的任务。在queue(还没有执行)中的operation都是自己组织执行根据优先级和相互作用对象依赖。一个application可能会创建多个操作队列,然后执行他们其中的任何一个操作。
需要注意:NSOperationQueue为NSOperation分配不同的线程来执行。
- (void)testOperationQueue {
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation1:%p",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation2:%p",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation3:%p",[NSThread currentThread]);
}];
[operationQueue addOperation:blockOperation1];
[operationQueue addOperation:blockOperation2];
[operationQueue addOperation:blockOperation3];
}
上面是一个简单的测试程序,我们可以看到在一个NSOperationQueue中添加了三个块操作。然后执行结果如下:
第一次执行:
-- ::24.954 GCD[:] main Thread is 0x7ff3fc111ac0
-- ::24.955 GCD[:] blockOperation3:0x7ff3f8f09ea0
-- ::24.955 GCD[:] blockOperation1:0x7ff3fc31dd50
-- ::24.955 GCD[:] blockOperation2:0x7ff3f8f09dc0
可见NSOperationQueue为NSBlockOperation分配了不同的线程。而是是并发操作。也就是说NSOperation默认是并发执行的,要想串行执行很简单,只需要设置一下NSOperationQueue的一个属性即可:
operationQueue.maxConcurrentOperationCount = ;
该属性来控制NSOperationQueue的最大并发数量,当设置为1是就是串行执行了。
接下来看看下边的代码:
- (void)testOperationQueue {
// NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation1:%p",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation2:%p",[NSThread currentThread]);
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation3:%p",[NSThread currentThread]);
}];
// operationQueue.maxConcurrentOperationCount = 1;
// [operationQueue addOperation:blockOperation1];
// [operationQueue addOperation:blockOperation2];
// [operationQueue addOperation:blockOperation3];
[blockOperation1 start];
[blockOperation2 start];
[blockOperation3 start];
}
我没有将NSBlockOperation放到NSOperationQueue中,而是直接自己调用了start方法,此时会有什么结果呢???????
看结果:
-- ::21.451 GCD[:] main Thread is 0x7fe178a11a70
-- ::21.451 GCD[:] blockOperation1:0x7fe178a11a70
-- ::21.452 GCD[:] blockOperation2:0x7fe178a11a70
-- ::21.452 GCD[:] blockOperation3:0x7fe178a11a70
结果表明:当我直接去调用NSOperation的start方法时,此时所有的NSOperation都是在主线程上执行的。因为他们的线程地址一样。而且是顺序执行的。
此外,NSOperation还提供了cancel方法,不过这里cancel只能取消状态为Ready、Finish的NSOperation,不能取消正在执行的操作。
再此外,NSOperation还提供了addDependency:方法。
addDependency方法的作用是使接收者一栏指定操作的完成。接收者不考虑去执行它自己直到所有它的依赖操作结束执行。如果接收者准备执行它的任务,添加依赖就没有实际性的影响了。该方法可能改变接收者的isReady和依赖属性。举个例子:
[operation3 addDependency:operation2]; //操作3依赖于操作2
如上边那句代码,意思是operation3依赖于operation2的操作,如果operation2没有执行,并且operation3还没有准备执行它的任务,那么他们的执行顺序一定是operation2先执行,然后operation3后执行。
------------------------------------------------------NSBlockOperation结束---------------------------------------------------------------------------------
NSInvocation
上边已经介绍了这个类的大概作用,现在来看看它的使用:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"main Thread is %p",[NSThread mainThread]);
[self nsInvocationOperationTest];
}
- (void)nsInvocationOperationTest {
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];
[operation start];
}
- (void)test {
NSLog(@"operation:%p",[NSThread currentThread]);
}
执行结果如下:
-- ::23.359 GCD[:] main Thread is 0x7f9442e07fe0
-- ::23.360 GCD[:] operation:0x7f9442e07fe0
操作对象默认在主线程中执行,这个和NSBlockOperation一样。如果是多个则是串行执行。如果我们没有把它放在NSOperationQueue中,都是在主线程执行。
NSOperation总结:
NSBlockOperation可以单独的调用start执行,但是此时都是再主队列中执行的。
NSBlockOperatioin可以添加到NSOperationQueue中执行,此时都是新建的线程执行。可以通过cancel取消ready和执行完毕的线程和addDependency设置线程依赖。
-------------------------------------------------------------------------------------NSOperation结束-------------------------------------------------------------------------------------
NSThread
它是比NSOperation和GCD都要轻量级的线程。
它有两种直接创建形式
[[NSThread alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>];
[NSThread detachNewThreadSelector:<#(SEL)#> toTarget:<#(id)#> withObject:<#(id)#>]
也就是第一个种使用实例方法。initWithTawrget...那个。第二个是使用的类方法。
第一种创建的线程是先创建线程对象,然后在运行线程操作,需要手动调用start方法。
第二种是直接创建线程并且开始运行线程。
还有一种不显式创建线程的方法:
[self performSelector:<#(SEL)#> withObject:<#(id)#>]
就是使用NSObject的类方法。
---------------------------------------------------------------------------NSThread就这么多吧---------------------------------------------------------------------------
至于GCD,请参考这里
现在来对比一下三者:
NSThread:
优点:比其他两个轻量级、使用简单
缺点,需要自己管理线程的生命周期、线程同步、加锁、睡眠等。
NSOperation:
优点:不需要关心线程管理以及数据同步
NSOperation是面向对象的。
GCD:
iOS4.0+才能使用,是替代NSThread/NSOperation的高效和强大的技术。
它是基于C语言的。
------------------------------------------------------------------先介绍这么多吧------------------------------------------------------------------
addDependency
iOS多线程技术的更多相关文章
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- iOS 多线程技术2
iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue a ...
- 浅谈iOS多线程
浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...
- iOS开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- 多线程技术在iOS开发中的使用
进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...
- OS X 和iOS 中的多线程技术(上)
OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...
- OS X 和iOS 中的多线程技术(下)
OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...
- iOS的多线程技术
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
随机推荐
- The connection to adb is down, and a severe error has occured.(DDMS中没有真机)
最近老是出现真机用着用着就掉线了,在DDMS中看不到,运行项目出现选择运行机器中也没有,360助手连接电脑OK,任务管理器中没有adb.exe,重启eclipse不行,只能每次重启电脑.按照http: ...
- AEM - Adobe CMS 扒坑记之始
AEM是Adobe公司所出的商业内容管理系统,全称阿豆比体验管理系统(Adobe Experience Manager),其前身叫CQ,分别有CQ5 CQ6两个大版本.它提供了整套的网站内容管理系统解 ...
- 『创意欣赏』20款精致的 iOS7 APP 图标设计
这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...
- springMVC源码分析之拦截器
一个东西用久了,自然就会从仅使用的层面上升到探究其原理的层面,在javaweb中springmvc更是如此,越是优秀的框架,其底层实现代码更是复杂,而在我看来,一个优秀程序猿就相当于一名武林高手,不断 ...
- [C#] 谈谈异步编程async await
为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中, ...
- 点餐APP 冲刺二总结
冲刺二我们小组主要是实现数据库的增删改查等功能, 因为小组成员对数据库都不是很熟悉,所以花了比较多 的时间去学习,功能实现起来也是很艰难,所以第二个 冲刺结束后我们的数据库还是有点问题,不能成功 ...
- STL or 线段树 --- CSU 1555: Inversion Sequence
Inversion Sequence Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1555 Mean: 给你一 ...
- (Python学习4)List对象
1.PyListObject对象 typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated; } PyLi ...
- c#开发工具软件集合
visual studio 2015(自带Nuget) Resharper de4dot dnspy ILMergeGui Git 大漠插件3.1233 天使插件v4.019 Navicat_Prem ...
- C# 通用验证类 支持 WPF,MVC,Winform
验证方式, 通过继承 IDataErrorInfo接口 和 DataAnnotations 解释标记语言而实现, 为了能在WPF上通用,所了也要继承属性更改通知接口INotifyPropertyC ...