多线程
分别尝试了以下几种多线程方式
1、NSThread
2、NSOperation
3、NSOperationQueue
4、GCD
一、NSThread
创建:
1、//直接用方法开始:
[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];
2、//先创建对象在开始:
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(method:) object:nill];
[myThread start];
简单使用:[self performSelectorInBackground:@selector(doSomething) withObject:nil];
更新UI须回到主线程中,可以通过:performSelectorOnMainThread来实现,或者用委托函数
二、NSOperation
[operation start]//开始线程
[operation cancel];//取消线程
//监听线程完毕后的操作(可用点语法)
[operation setCompletionBlock = ^(){
NSLog(@“执行完毕”);
}];
//是否是同步还是异步执行。默认是 NO,即同步执行
[operation isConcurrent];
创建线程
NSOperation主要包括三种:1、NSInvocationOperation 2、NSBlockOperation 3、自定义NSOperation
1、NSInvocationOperation
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSomething) object:nil];
2、NSBlockOperation
//一个Operation中是并行操作的
//创建Operation
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){
}];
//增加一个并行线程
[operation addExecutionBlock:^(){
}];
3、自定义NSOperation
定义非并发操作时重载main函数
定义并发操作时重载。
main函数中每次要执行操作是都要判断一次isCancelled函数
三、NSOperationQueue
NSOperation *queue = [NSOperation alloc]init];
[queue setMaxConcurrentOperationCount:2]//设置最大并发数
[queue addOperation:operation1];
[queue addOperation:operation2];
//当operation2执行完了才执行operation1
[operation1 addDependency:operation2];
//主线程
[NSOperationQueue main] addOperation ^{
};
[[NSOperationQueue main] addOperation:op3];
四、GCD(Grand Central Dispatch)
串行:按顺序执行
并行:并发执行,无顺序执行
同步操作:dispatch_sync,不开新线程
异步操作:dispatch_async,开辟新线程。
串行+异步:常用,开新线程,顺序执行任务(下载耗时任务)
并行+异步:有用,开新线程,无序执行任务
串行+同步:无用,不开线程,顺序执行任务
并行+同步:无用,不开线程,无序执行任务
全局队列:系统自带的一个并行队列
主队列:主线程执行的队列,实际上是一个串行队列
1、新建队列
//新建串行队列
//第一个参数是queue标签,用于debug,第二个参数为0
dispatch_queue_t queue = dispatch_queue_create(“ThreadName”,0);
//新建并行队列(global全局队列)
dispatch_queue_t queue = dispatch_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//DISPATCH_QUEUE_PRIORITY_HIGH(高),DISPATCH_QUEUE_PRIORITY_DEFAULT(普通),DISPATCH_QUEUE_PRIORITY_LOW(低),DISPATCH_QUEUE_PRIORITY_BACKGROUND(后台)
//新建主线程
dispatch_queue_t queue = dispatch_get_main_queue();
2、添加任务
//添加异步任务(第一个参数是要添加的队列名,第二个参数是要添加的代码块)
//该方法添加完队列,不会等待队列完成就开始执行任务
dispatch_async(queue,^{
doSomething;
});
或
dispatch_async_f();
//添加同步任务
//等待队列中的任务完成再继续执行
dispatch_sync(queue,^{
doSomething;
});
或
dispatch_sync_f();
3、组应用
dispatch_group_t = dispatch_group_create();
dispatch_group_async(group,queue,^{
doSomething;
})
//在组中等待,组织当前线程继续执行
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);