NSThread:
–优点:NSThread 比其他两个轻量级,使用简单
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
•NSOperation:
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
–NSOperation是面向对象的
•GCD:
–Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
1. NSThread的多线程技术:
[NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil];//类方法不用自己开启
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo)object:nil]; //成员方法启动start线程[thread start];
对于NSThread的简单使用,可以用NSObject的performSelectorInBackground替代:[self performSelectorInBackground:@selector(function) withObject:nil];
同时 在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露。
//自动释放池
//负责其他线程上的内存管理,在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池
//否则容易出现内存泄露。
@autoreleasepool {
}
2 NSOperation,面向对象的多线程技术
//实例化操作队列
_queue = [[NSOperationQueue alloc] init];
//控制同时最大并发的线程数量
[_queue setMaxConcurrentOperationCount:2];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction)object:nil]; 或者
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
}];
//添加操作之间的依赖关系,所谓“依赖”关系,就是等待前一个任务完成后,后一个任务才能启动
//依赖关系可以跨线程队列实现
//提示:在指定依赖关系时,注意不要循环依赖,否则不工作。
[operation2 addDependency:operation1];
[operation3 addDependency:operation2];
将操作添加到队列NSOperationQueue即可启动多线程执行
[_queue addOperation:operation];
[NSOpeationQueue mainQueue] addOperation^{
//刷新UI
};
3. GCD
//全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
串行队列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
//主队列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main - > %@", [NSThread currentThread]);
});
// group队列使用
dispatch_queue_t dispatchQueue = dispatch_queue_create("hah.next", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t dispatchGroup=dispatch_group_create();
dispatch_group_async(dispatchGroup, dispatchQueue,^(){
NSLog(@"dispatch-1");
});
dispatch_group_async(dispatchGroup, dispatchQueue,^(){
NSLog(@"dspatch-2");
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(),^(){
NSLog(@"end"); //异步任务无序 ,最后执行这个任务
});