多线程分为GCD,NSOperation和NSThread。GCD底层是用C语言实现的,NSOperation是对GCD轻量级的封装。NSThread是比较原始的方法了。
1、GCD创建多线程
首先,我们需要创建一个队列,队列根据不同的需要创建为串行队列和并行队列
dispatch_queue_t q = dispatch_queue_create("xiancheng",DISPATCH_QUEUE_CONCURRENT)
函数中第一个参数是当前队列的名称,第二个参数是创建队列的类型:DISPATCH_QUEUE_CONCURRENT为并行队列,DISPATCH_QUEUE_SERIAL为串行队列。
另外,队列还有主队列和全局队列。
主队列:dispatch_queue_t queue = dispatch_get_main_queue();获取主线程队列,在主线程更新UI。
全局队列:dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
接下来我们可以使用dispatch_async或dispatch_sync函数来加载需要运行的任务。
同步线程:
dispatch_sync(queue,^{
block的具体代码(即需要执行的任务)
});
同步执行任务代码,不会返回函数,知道block中的代码执行完毕。嵌套使用时容易引起死锁。
异步线程:
dispatch_async(queue,^{
block中的任务代码
});
异步执行block,函数立即返回。
NSOperation:
同样的,NSOperation需要一个队列
在.m文件中,输入以下内容:
#import “ViewController.h”
@interface ViewController()
@property(noatomic,strong) NSOperationQueue *myQueue;
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
初始化队列
self.myQueue = [[NSOperationQueue alloc] init];
}
创建一个线程
[self.myQueue addOperationWithBlock:^{
Block中的任务代码
}]
在主线程中执行任务
[NSOperationQueue mainQueue] addOperationWithBlock:^{
block中的任务代码
}];
多个线程时,设置线程的执行顺序
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
任务代码
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
任务代码
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
任务代码
}];
假设我们需要线程的执行顺序为:op1,op2,op3.
思想就是线程2依赖于线程1,等线程1执行完毕后执行线程2.
[op2 addDependency:op1];
[op3 addDependency:op2];
将线程依次添加到队列中
[self.myQueue addOperation:op1]
[self.myQueue addOperation:op2]
[self.myQueue addOperation:op3]
@end