多线程-GCD3


#import <Foundation/Foundation.h>

@interface dataManage : NSObject

+(instancetype)sharedDataManager;
@end



#import "dataManage.h"
static dataManage *_dataManager = nil;
@implementation dataManage

+(instancetype)sharedDataManager {
//这是正确写单例的正确形式之一
/*
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

if (_dataManager == nil) {
_dataManager = [[dataManage alloc]init];
}
});
return _dataManager;
*/

//单例写法的第二种方式
@synchronized(_dataManager) {
if (!_dataManager) {
_dataManager = [[dataManage alloc]init];
}
}
return _dataManager;
}

@end







#import "ViewController.h"

#import "dataManage.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


//GCD 全称:Grand Central Dispatch 他是iOS里面最简单。最底层的实现多线程的API,执行料率相对较高
//GCD里面主要分为两大队列,串行队列和并行队列,
//串行队列特点:队列里面任务一个挨着一个完成(依次完成)
//并行队列的特点:队列里面任务依次开始,但是结束时间并不一定(可能前一个任务还没有结束,下一个任务就已经结束)

}

#pragma mark 串行队列第一中创建方式
- (IBAction)serialFirstButtonDidClicked:(id)sender {

//串行队列有两种创建方式
//1、获取主队列。特点:这些任务全部是在主线程依次完成
dispatch_queue_t queue = dispatch_get_main_queue();
//任务快全部采用block的形式封装。任务添加到队列和任务快得书写合在一起
dispatch_async(queue, ^{
//任务块
NSLog(@"任务一,%@, %d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务三,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务四,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务五,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务六,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务七,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});

#pragma mark //以下这个方式可以实现从子线程回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
}


#pragma mark 串行队列第二中创建方式
- (IBAction)serialSecondButtonDidClicked:(id)sender {
//这种创建的队列也叫用户队列,特点:队列里面的任务会依次字线程按照顺序完成
//第一个参数:队列的名字,字符串类型。苹果推荐使用反向域名的形式com.baidu.www
//第二个参数:决定了这个队列到底串行还是并行
dispatch_queue_t queue = dispatch_queue_create("com.lanou.shuai", DISPATCH_QUEUE_SERIAL);//串行
dispatch_async(queue, ^{
//任务块
NSLog(@"任务一,%@, %d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务三,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务四,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务五,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务六,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务七,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务八,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务九,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务十,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});


}
#pragma mark 并行队列的第一种创建方式
- (IBAction)conCurrentButtonDidClicked:(id)sender {
//iOS提供了3个全局队列
//第一个参数:队列的优先级,在这有四个优先级(队列的优先级)DISPATCH_QUEUE_PRIORITY_BACKGROUND DISPATCH_QUEUE_PRIORITY_LOW DISPATCH_QUEUE_PRIORITY_DEFAULT DISPATCH_QUEUE_PRIORITY_HIGH
//第二个参数:苹果的保留参数,目前没有用到
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"任务一,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务三,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务四,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务五,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务六,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务七,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务八,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务九,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务十,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});

}

#pragma mark 并行队列的第二种创建方式
- (IBAction)concurrenSecondButtonDidClicked:(id)sender {
dispatch_queue_t queue = dispatch_queue_create("com.lanou.www", DISPATCH_QUEUE_CONCURRENT);//并行队列
dispatch_async(queue, ^{
NSLog(@"任务一,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务二,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务三,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务四,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务五,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务六,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务七,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务八,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务九,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务十,%@,%d",[NSThread currentThread],[NSThread isMainThread]);
});


}
#pragma mark async 和 sync 区别
- (IBAction)asyncAndsyncButtonDidClicked:(id)sender {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
NSLog(@"async");
});
NSLog(@"hehe");
//错误说法一:sync是同步async是异步;
//错误说法二:sync是主线程,async是子线程;
//区别在于:sync会等到线程 任务处理完成之后再去执行block外面的任务,对于async来说不会等线程block里面的任务执行完毕就会去block外面执行任务
}
#pragma mark 一段代码在程序运行期间只执行一次
- (IBAction)dispatchButtonDidClicked:(id)sender {

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

NSLog(@"你试试我会不会打印两次");
});
}
#pragma mark 分组
- (IBAction)GroupButtonDidClicked:(id)sender {
//dispatch_group用于把不同的任务分组,这时候整个小组的任务是一个整体;
//通常情况下还需要使用dispatch_group_notify用来监测分组里面的任务,如果任务全部完成,可以执行其他的某个任务;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建一个组
dispatch_group_t group = dispatch_group_create();
//把任务块加到队列的同时也归为group这个分组
dispatch_group_async(group, queue, ^{

NSLog(@"任务一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"任务二");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"group我是最后需要完成的任务");
});//写到哪都行,就是不能写到第一个(那个时候还没有监测到组里面有其他的任务)
dispatch_group_async(group, queue, ^{
NSLog(@"任务三");
});
dispatch_group_async(group, queue, ^{

NSLog(@"任务四");
});

}
#pragma mark 一个任务多次执行
- (IBAction)AplayButtomDidClicked:(id)sender {
//第一个参数:任务快执行的次数,
//第二个参数:队列
NSArray *array = @[@"张俊芳",@"王俊",@"姜彭生"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//index手动加上否会报错
dispatch_apply(array.count, queue, ^(size_t index) {
NSLog(@"%@喜欢他同桌",array[index]);

});

}
#pragma mark 障碍物
- (IBAction)barrierButtonDidClicked:(id)sender {
//需求:数据库的读写
//数据库同时有多个任务在读取一块数据没有问题,但是多个任务同时往一个地方写入的数据的时候有可能出现问题
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"读取数据库一");
});
dispatch_async(queue, ^{
NSLog(@"读取数据库二");
});
dispatch_async(queue, ^{
NSLog(@"读取数据库三");
});
//第四个任务:数据库写入数据
dispatch_barrier_async(queue, ^{
NSLog(@"写入数据库");
});
dispatch_async(queue, ^{
NSLog(@"读取数据库四");
});
dispatch_async(queue, ^{
NSLog(@"读取数据库五");
});
dispatch_async(queue, ^{
NSLog(@"读取数据库六");
});

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值