1.NSObject
- (IBAction)nsobjectAction:(UIButton *)sender {
NSLog(@"NSObject");
// 在后台执行(开辟多线程最简单的一个方法)
[self performSelectorInBackground:@selector(test) withObject:nil];
}
2.NSThread
- (IBAction)nsthreadAction:(UIButton *)sender {
NSLog(@"NSThread");
// NSThread是一个轻量级的多线程,创建方式有两种
// 1.init创建,并且需要手动开启
// NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];
// 开启线程
[thread start];
// 取消线程
[thread cancel];
// 2.初始化的同时自动开启子线程
[NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:nil];
}
3.NSOperation NSOperationQueue
- (IBAction)operationAction:(UIButton *)sender {
NSLog(@"NSOperation”);
// 时间片轮转
// NSOperation是一个抽象类,他有两个子类 NSInvocationOperation 和 NSBlockOperation
// 在MVC里面属于M层,封装了单个任务的数据和相关的代码,一般我们使用子类
// NSOperation是一个操作,本身并无主线程子线程的区分,通常与NSOperationQueue结合使用
// NSInvocationOperation
NSInvocationOperation *invocatinOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];
// NSBlockOperation
__weak typeof (self)temp = self;
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ [temp test];
NSLog(@"这是blockOperation操作执行的"); }];
// NSOperationQueue 是线程操作队列,用来管理一组合适Operation对象,会根据实际需求,创建出合适数量的子线程(不一定和任务个数一样),完成任务的并发执行
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置最大并发执行数(当最大并发执行数为1的时候,程序是串行执行的)
[queue setMaxConcurrentOperationCount:1];
// 设置依赖关系[A addDependency:B]; 若A依赖B,则B先执行,A再执行
[invocatinOperation addDependency:blockOperation];
// 添加队列
[queue addOperation:invocatinOperation];
[queue addOperation:blockOperation];
}
4.GCD
- (IBAction)gcdAction:(UIButton *)sender {
NSLog(@"GCD");
// GCD有三种队列
// 主队列
// 全局队列
// 自定义队列(串行队列,并行队列)
__weak typeof (self)temp = self;
// 1.主队列(串行队列)
// 获取主队列生成一个串行的队列,队列里面的block块,按照FIFO(先进先出)的顺序执行,实际上就是一个单线程队列
// 创建队列 获取主线程
dispatch_queue_t queue = dispatch_get_main_queue();
// 1)往主队列里面添加任务
dispatch_async(queue, ^{
[temp test];
NSLog(@"1");
});
dispatch_async(queue, ^{
[temp test];
NSLog(@"2");
});
dispatch_async(queue, ^{
[temp test];
NSLog(@"3");
});
// 2)延时任务 参数delayInSeconds:延时的时间
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"今晚如家402等你");
});
// 3)同步添加任务 (同步非常卡一般不用)
dispatch_sync(queue, ^{
[temp test];
dispatch_sync(queue, ^{
[temp test];
});
});
// 2.全局队列 (并发执行)
// 创建队列
// 第一个参数为优先级,这里选择默认
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 1)添加任务
dispatch_async(global, ^{
[temp test];
NSLog(@"1");
});
dispatch_async(global, ^{
[temp test];
NSLog(@"2");
});
dispatch_async(global, ^{
[temp test];
NSLog(@"3");
});
// 2)重复执行
// 第一个参数:重复执行的次数
// 第二个参数:指定执行的队列
// 第三个参数:size_t t 相当于变量int t
dispatch_apply(5, global, ^(size_t t) {
NSLog(@"执行到%ld次",t);
});
// 3.自定义队列
// 1)串行队列
// <1>
// 第一个参数: 标签
// 第二个参数: 串行队列 serial
dispatch_queue_t queue1 = dispatch_queue_create("AAA", DISPATCH_QUEUE_SERIAL); dispatch_async(queue1, ^{
[temp test];
NSLog(@"1");
});
dispatch_async(queue1, ^{
[temp test];
NSLog(@"2");
});
dispatch_async(queue1, ^{
[temp test];
NSLog(@"3");
});
// <2>添加函数 把字符串传进函数里
dispatch_async_f(queue1, "testContext", function);
// 2)并发队列 concurrent
dispatch_queue_t queue2 = dispatch_queue_create("com.baidu", DISPATCH_QUEUE_CONCURRENT);
// <1>障碍执行
// 该方法创建的任务在执行的时候,会先检查是否有其他任务正在执行,若有,等待其执行完毕再执行,否则,其他任务要等待它执行完毕之后再执行
dispatch_barrier_async(queue2, ^{
[temp test];
NSLog(@"障碍执行");
});
// <2>分组任务
dispatch_group_t group = dispatch_group_create();
// 添加任务
dispatch_group_async(group, queue2, ^{
[temp test];
NSLog(@"1");
});
dispatch_group_async(group, queue2, ^{
[temp test];
NSLog(@"2");
});
dispatch_group_async(group, queue2, ^{
[temp test];
NSLog(@"3");
});
// <3>拒绝拿第一 最后再执行
dispatch_group_notify(group, queue2, ^{
NSLog(@"最后,去了如家402");
});
}
子线程回到主线程(线程间通信)
// 1.NSObject
// 1)
[self performSelectorOnMainThread:@selector(backMainThread) withObject:nil waitUntilDone:YES];
// 2)
[self performSelector:@selector(backMainThread) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
// 2.GCD
dispatch_async(dispatch_get_main_queue(), ^{
// 在这里面进行主线程任务的操作(UI刷新)
});
}
- (void)backMainThread{
NSLog(@"在该方法内实现主线程UI的刷新");
}