OC中多线程主要使用的GCD和NSOperation和NSOperationQueue
GCD时基于C语音开发的一套多线程开发机制,时完全面向过程的。GCD统一管理整个队列中的任务。GCD队列分为并行队列和串行队列。
串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。
并发队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。
NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开中需要使用其子类NSInvocationOperation、NSBlockOperation)放到NSOperationQueue这个队列中线程就会依次启动。NSOperationQueue负责管理、执行所有的NSOperation,在这个过程中可以更加容易的管理线程总数和控制线程之间的依赖关系。
NSOperation有两个常用子类用于创线程操作:NSInvocationOperation和NSBlockOperation,两种方式本质没有区别,但是是后者使用Block形式进行代码组织,使用相对方便。
简单了解了GCD和NSOoperation 下面主要适演练一下在各自情况下的控制多线程的方法
/**
* 串行异步
* 串行:顺心执行 异步:会开线程 组合起来就是开一条线程顺序执行 缺点只会开一条线程
*/
-(void)demo1GCD{
//DISPATCH_QUEUE_CONCURRENT并发 DISPATCH_QUEUE_SERIAL//串行
NSString *indetify = @"indetify";
const char *label = [indetify UTF8String];
dispatch_queue_t queue = dispatch_queue_create(label, DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"thread1:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
});
dispatch_async(queue, ^{
NSLog(@"thread2:%@",[NSThread currentThread]);
// [NSThread sleepForTimeInterval:1.0];
});
dispatch_async(queue, ^{
NSLog(@"thread3:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
});
}
/**
* 分组控制线程的执行顺心
*/
-(void)demo2GCD
{
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"group1:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"group2:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:5.0];
});
//分组里面的现场执行完 才执行
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"group4:%@",[NSThread currentThread]);
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"group3:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
});
}
/**
* addDependency 添加依赖控制线程执行顺心
*/
-(void)demoOperation
{
NSBlockOperation *oper1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation1:%@",[NSThread currentThread]);
}];
NSBlockOperation *oper2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation2:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
NSBlockOperation *oper3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Operation3:%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
[oper1 addDependency:oper2];
[oper1 addDependency:oper3];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue setMaxConcurrentOperationCount:5];//设置线程并发量
[queue addOperation:oper1];
[queue addOperation:oper2];
[queue addOperation:oper3];
}
总结:
>在GCD中串行队列中的异步执行,可以方便地控制执行顺序,但只会开一条线程。并发队列在多个线程中执行(前提是使用异步方法),顺序控制相对复杂,但是效率更高。NSOperation中通过添加依赖不管是所有线程都顺心执行还是某几个并发先执行都很方便。
顺便提一个几个通知主线程更新UI的方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;方法传递主线程[NSThread mainThread])
[NSOperationQueue mainQueue] addOperationWithBlock:
dispatch_sync(dispatch_get_main_queue(), ^{})