标签:
多线程主要有以下三个实现方式:
NSThread ,
NSOperation (使用NSOperation 和 NSOperationQueue)
GCD(Grand Central Dispatch)
NSThread
相当于自己创建一个线程,创建线程的时候,可以把一个方法放到创建的线程中,
创建的方式主要有以下两种:
1. [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self
withObject:nil];
2. NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];
[myThread start]; // 启动线程
优点:NSThread 比其他的两个轻量级。
NSOperation (使用NSOperation 和 NSOperationQueue)
NSOperation 不需要自己创建线程,只关注需要在分线程完成的代码,然后把NSOperation 放到 NSOperationQueue 中即可,NSOperationQueue 会把代码放到分线程中执行。
NSOperation 的作用:配合使用 NSOperation和 NSOperationQueue 也能够实现多线程编程。
NSOperation和NSOperationQueue 实现多线程的具体步骤:
(1)先将需要执行的操作封装到一个NSOperation对象中的main 方法
(2)然后将NSOperation 对象添加到 NSOperationQueue 中
(3)系统会自动将NSOperationQueue中的 NSOperation 取出来
(4)将取出的NSOperation封装的操作放到一条新的线程中执行
NSOperation的子类
NSOperation是一个抽象的类, 并不具备封装操作的能力,必须使用它的子类。使用 NSOperation 子类的方式有3种:
(1)NSInvocationOperation
(2)NSBlockOperation
(3)自定义子类继承 NSOperation,实现内部相应的方法
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
GCD(Grand Central Dispatch)
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统,这建立在任务并行执行的线程池模式的基础上的。
GCD 的工作原理:
1,让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用使用的处理器核心上执行任务。
2,一个任务可用是一个函数(function)或者是一个block,GCD的底层依然是用线程来实现的,不过这样可以让程序员不用关注实现的细节。
3,GCD 中必须要使用的是各种队列。我们通过block,把具体的代码放到队列中,队列中的任务排队执行,系统会自动的把队列中的各个任务分配到具体的线程中和CPU中(如果是多核处理器),具体创建多少个线程,分配到哪个cpu上,都是由系统管理。
GCD中的三种队列类型:
1,The main queue :系统自带的一个队列。放到这个队列中的代码会被系统分配到主线程中执行。main queue 可以调用dispatch_get_main_queue()来获得,因为main queue是与主线程相关的,所以这是一个串行队列,提交至其中的任务顺序执行(一个任务执行完毕后,再执行下一个任务)。
2.Global queue :整个应用程序存在三个全局队列(系统已经创建好,只需要获得即可):高。中(默认)。低 三个优先级队列,可以调用dispatch_get_global_queue 函数传入优先级来访问队列。全局队列是并行队列,可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才能有效执行。
3.用户自己创建队列:dispatch_queue_create 创建的队列,可以是串行的,也可以是并行的,因为系统已经给我们提供了并行,串行队列,所以一般情况下我们不再需要创建自己的队列,用户创建的队列可以有任意多个。
注意:分线程中不能刷新UI,刷新UI 只能在主线程,如果每个线程都可以刷新UI,将会很容易造成UI冲突,会出现不同步的情况,所以只有主线程中能刷新UI系统是为了降低编程的复杂度,最大程度的避免冲突。
分线程中回到主线程的主要两种方式
1.performSeletorOnMainThread
2.使用main queue
分线程在使用的时候,有以下几个需要说明的地方:
1,之前的版本中分线程不会自动创建autorelease pool,所以需要在分线程创建的时候创建autorelease pool。目前的sdk 版本已经不再需要。
2.timer 不能再分线程中直接使用,需要手动开启run loop。
3,如果多个线程修改(只是读取变量,不会有问题)同一个资源,需要注意线程同步的问题。
标签:
原文地址:http://www.cnblogs.com/iOS-OC/p/5510578.html