第一种NSThread
//NSThread 方法1 需要手动start];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"参数"];
thread.name =@"线程1";
//优先级 0.0-1.0 默认0.5 0.0最低1.0最高
thread.threadPriority=0.6;
[thread start];
//NSThread 方法2
[NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"参数"];
//NSThread 方法3
[self performSelectorInBackground:@selector(threadRun:) withObject:@"参数"];
}
//多个参数可以用数组或者字典
-(void)threadRun:(NSString *)param{
//回到主线程
[self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}
第二种 GCD
-(void)gcdThread{
/**第一种自己创建队列
第一个参数:C语言的字符串,标签随便填
第二个参数 队列的类型。
DISPATCH_QUEUE_CONCURRENT并发 //开多条线程
DISPATCH_QUEUE_SERIAL 串行 只开一条线程
*/
// dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
/**
第二种拿系统的队列
第一个参数 优先级
第二个参数 预留给未来使用 随便填0
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//线程内
dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程
});
});
}
/**
gcd栅栏函数
会先执行栅栏函数前面的异步任务
然后执行栅栏函数
再执行栅栏函数下面的异步任务
*/
-(void)barrier{
/**这里的队列必须用dispatch_queue_create创建的
不能用系统的dispatch_get_global_queue
否则不会生效*/
dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
});
}
/**gcd队列组
可以添加完成任务通知功能
用于任务监听
*/
-(void)group{
//创建队列
dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
// 创建队列组
dispatch_group_t group=dispatch_group_create();
//异步函数
dispatch_group_async(group, queue, ^{
NSLog(@"异步一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"异步二");
});
dispatch_group_async(group, queue, ^{
NSLog(@"异步三");
});
//异步等
dispatch_group_notify(group, queue, ^{
NSLog(@"全部任务完成通知");
});
//死等 任务不完成 后面代码不执行
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
/**gcd快速迭代*/
-(void)apply{
/**
快速迭代
第一个参数遍历的参数
第二个参数队列必须是并发队列
第三个参数 遍历的索引*/
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
});
}
/*
第三种 线程
NSoperation
*/
-(void)operation{
//第一种方式
// NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
//第二种方式
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg
"];
NSData *imageData= [NSData dataWithContentsOfURL:url];
_image= [UIImage imageWithData:imageData];
}];
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
}];
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
}];
[operation addExecutionBlock:^{
//可以追加任务
}];
operation.completionBlock = ^{
// 完成监听
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//主线程更新任务
if(_image){
// NSLog(@"主线程更新任务");
[_iv setImage:_image];
}
}];
};
//如果2添加依赖1 那么执行完1才会执行2
[operation2 addDependency:operation1];
//如果operation1添加依赖operation 那么执行完operation才会执行operation1
[operation1 addDependency:operation];
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//设置最大并发数
// queue.maxConcurrentOperationCount=3;
[queue addOperation:operation];
[queue addOperation:operation1];
[queue addOperation:operation2];
// [queue setSuspended:YES];//暂停 NO可以恢复 不能暂停正在执行状态的任务
// [queue cancelAllOperations];//取消 不可以恢复
//
// //简便方法
// [queue addOperationWithBlock:^{
// //线程任务;
// }];
}
//NSThread 方法1 需要手动start];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"参数"];
thread.name =@"线程1";
//优先级 0.0-1.0 默认0.5 0.0最低1.0最高
thread.threadPriority=0.6;
[thread start];
//NSThread 方法2
[NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"参数"];
//NSThread 方法3
[self performSelectorInBackground:@selector(threadRun:) withObject:@"参数"];
}
//多个参数可以用数组或者字典
-(void)threadRun:(NSString *)param{
//回到主线程
[self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}
第二种 GCD
-(void)gcdThread{
/**第一种自己创建队列
第一个参数:C语言的字符串,标签随便填
第二个参数 队列的类型。
DISPATCH_QUEUE_CONCURRENT并发 //开多条线程
DISPATCH_QUEUE_SERIAL 串行 只开一条线程
*/
// dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
/**
第二种拿系统的队列
第一个参数 优先级
第二个参数 预留给未来使用 随便填0
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//线程内
dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程
});
});
}
/**
gcd栅栏函数
会先执行栅栏函数前面的异步任务
然后执行栅栏函数
再执行栅栏函数下面的异步任务
*/
-(void)barrier{
/**这里的队列必须用dispatch_queue_create创建的
不能用系统的dispatch_get_global_queue
否则不会生效*/
dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
});
}
/**gcd队列组
可以添加完成任务通知功能
用于任务监听
*/
-(void)group{
//创建队列
dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
// 创建队列组
dispatch_group_t group=dispatch_group_create();
//异步函数
dispatch_group_async(group, queue, ^{
NSLog(@"异步一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"异步二");
});
dispatch_group_async(group, queue, ^{
NSLog(@"异步三");
});
//异步等
dispatch_group_notify(group, queue, ^{
NSLog(@"全部任务完成通知");
});
//死等 任务不完成 后面代码不执行
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
/**gcd快速迭代*/
-(void)apply{
/**
快速迭代
第一个参数遍历的参数
第二个参数队列必须是并发队列
第三个参数 遍历的索引*/
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
});
}
/*
第三种 线程
NSoperation
*/
-(void)operation{
//第一种方式
// NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
//第二种方式
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg
"];
NSData *imageData= [NSData dataWithContentsOfURL:url];
_image= [UIImage imageWithData:imageData];
}];
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
}];
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
//执行线程任务
}];
[operation addExecutionBlock:^{
//可以追加任务
}];
operation.completionBlock = ^{
// 完成监听
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//主线程更新任务
if(_image){
// NSLog(@"主线程更新任务");
[_iv setImage:_image];
}
}];
};
//如果2添加依赖1 那么执行完1才会执行2
[operation2 addDependency:operation1];
//如果operation1添加依赖operation 那么执行完operation才会执行operation1
[operation1 addDependency:operation];
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//设置最大并发数
// queue.maxConcurrentOperationCount=3;
[queue addOperation:operation];
[queue addOperation:operation1];
[queue addOperation:operation2];
// [queue setSuspended:YES];//暂停 NO可以恢复 不能暂停正在执行状态的任务
// [queue cancelAllOperations];//取消 不可以恢复
//
// //简便方法
// [queue addOperationWithBlock:^{
// //线程任务;
// }];
}