iOS支持多个层次的多线程编程,层次越高抽象程度越高,使用起来也越方便,也是苹果推荐的方式。
- Thread:最低抽象层次的,线程的管理、线程锁的设置与释放等都需要开发人员自己来负责,使用NSThread类来创建和管理线程。
- Cocoa Operations:通过NSOperation类来管理线程。NSOperation是一个抽象基类,iOS提供了两个默认实现:NSInvocationOperation和NSBlockOperation。
- Grand Central Dispatch(GCD):iOS 4开始支持GCD,它提供了一个全新的API,可以将应用程序需要执行的工作拆分为可以分散在多个线程多个cpu上更小的块。这个新API大部分使用程序块(Block)来访问。使用GCD,开发者需要做的唯一一件事就是定义需要执行的任务,并 把任务添加到合适的派遣队列(Dispatch Queue)中。GCD将负责创建线程,并将任务调度到合适的线程中。GCD技术使得线程管理已经成为系统的一部分,提供一个友好的任务管理和执行的方法,和传统的NSThread管理相比效率更高。
本节重点介绍GCD的使用:
- GCD派遣队列:是一个基于C语言的技术,队列可以按照顺序执行任务也可以同步执行任务,但是所有在队列里面的任务均按照“先进先出”的顺序。提交给派遣队列的任务必须封装成一个函数或者程序块(Block)。
- 顺序队列:
- 并发队列:也称全局派遣队列
- 主队列:是一个在应用程序的主队列,这个队列和应用程序的运行循环交错执行
几个例子:
1、顺序队列异步执行
异步不阻塞
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"队列开始执行....");
dispatch_queue_t queue ;
queue = dispatch_queue_create("iphone.book.queue", NULL);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"队列之中运行...");
});
NSLog(@"队列之后运行....");
}
2、顺序队列同步执行:
同步阻塞
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"队列开始执行....");
dispatch_queue_t queue ;
queue = dispatch_queue_create("iphone.book.queue", NULL);
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"队列之中运行...");
});
NSLog(@"队列之后运行....");
}
3、并发队列异步执行
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"队列开始执行....");
dispatch_queue_t queue ;
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"队列之中第一个任务运行...");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"队列之中第二个任务运行...");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"队列之中第三个任务运行...");
});
NSLog(@"队列之后运行....");
}
4、主线程队列
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"队列开始执行....");
dispatch_queue_t queue ;
queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
lblInfo.text = 计算结果
});
NSLog(@"队列之后运行....");
}
【注】:异步执行代码的其它方法:
除了通过多线程的方式进行异步代码执行外,还有其它方式来进行异步操作。
1、performSelector: withObject: afterDelay:
该方法是NSRunLoop对象针对NSObject类添加的类别(extension),因此基本所有的类都能执行该方法。
2、performSelectorOnMainThread: withObject: waitUntilDone:
该方法是NSThread类为NSObject类添加的方法。
3、scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:
通过NSTimer类的类方法,在一定的时间异步执行selector指定的方法。