1.NSThread:
1> 使用NSThread对象建立一个线程非常方便;
2> 但是!要使用NSThread管理多个线程非常困难,不推荐使用;
3> 技巧!使用[NSThread currentThread]跟踪任务所在线程,适用于这三种技术.
2.NSOperation/NSOperationQueue:
1> 是使用GCD实现的一套Objective-C的API;
2> 是面向对象的多线程技术;
3> 提供了一些在GCD中不容易实现的特性,如:限制最大并发数量,操作之间的依赖关系.
3.GCD---Grand Central Dispatch:
1> 是基于C语言的底层API;
2> 用Block定义任务,使用起来非常灵活便捷;
3> 提供了更多的控制能力以及操作队列中所不能使用的底层函数.
一.NSThread
Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread:
Cocoa threads: 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式。
线程创建与启动:
NSThread的创建主要有两种直接方式:
[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];和
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[myThread start];
这两种方式的区别是:前一种一调用就会立即创建一个线程来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级。
还有一种间接的方式,更加方便,我们甚至不需要显式编写 NSThread 相关代码。那就是利用 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程:
[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil];
其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。
附:performSelectorInBackground : withObject 代码示例:
9 #import "YYViewController.h" 10 @interface YYViewController () 11 @property (weak, nonatomic) IBOutlet UIImageView *iconView; 12 @end 13 14 @implementation YYViewController 15 16 - (void)viewDidLoad 17 { 18 [super viewDidLoad]; 19 } 20 21 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 22 { 23 24 // 在子线程中调用download方法下载图片 25 [self performSelectorInBackground:@selector(download) withObject:nil]; 26 } 27 28 29 30 -(void)download 31 { 32 //1.根据URL下载图片 33 //从网络中下载图片 34 NSURL *urlstr=[NSURL URLWithString:@"fdsf"]; 35 36 //把图片转换为二进制的数据 37 NSData *data=[NSData dataWithContentsOfURL:urlstr];//这一行操作会比较耗时 38 39 //把数据转换成图片 40 UIImage *image=[UIImage imageWithData:data]; 41 42 //2.回到主线程中设置图片 43 [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO]; 44 } 45 46 47 48 //设置显示图片 49 -(void)settingImage:(UIImage *)image 50 { 51 self.iconView.image=image; 52 } 53 54 @end二.NSoperation
1.简介
NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。
NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:
1> Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation
2> 自定义子类继承NSOperation,实现内部相应的方法
2.执行操作
NSOperation调用start方法即可开始执行操作,NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行
3.取消操作
operation开始执行之后, 默认会一直执行操作直到完成,我们也可以调用cancel方法中途取消操作
4.监听操作的执行
如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
三.GCD
请看这篇文章:http://blog.csdn.net/q199109106q/article/details/8566300