核心概念:將任務添加到隊列,指定任務執(zhí)行方法
任務
*使用block 封裝
*block 就是一個提前準備好的代碼塊,在需要的時候執(zhí)行
隊列
*串行:一個接一個的調度任務
*并發(fā):可以同時調度多個任務
任務執(zhí)行函數(shù) (都需要在線程中操作)
*同步執(zhí)行:當前指令不完成,不會執(zhí)行下個指令(不會到線程池中拿子線程)
*異步執(zhí)行:當前指令不完成,不會等待 繼續(xù)執(zhí)行下個指令(只要有任務,就會到線程池中取子線程;主隊列除外!)
開不開線程,取決于執(zhí)行任務的函數(shù),同步不開異步開
開幾條線程,取決于隊列,串行一條 并發(fā)多條(異步)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// [self gcdDemo1];
// [self gcdDemo2];
// [self gcdDemo3];
// [self gcdDemo4];
[self gcdDemo6];
}
//串行隊列:同步任務
//不會開啟線程 順序執(zhí)行
-(void)gcdDemo1{
/**
1.隊列 名稱
2.隊列的屬性 DISPATCH_QUEUE_SERIAL 標識串行
*/
dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);
//同步執(zhí)行任務
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
//串行隊列 異步任務
- (void)gcdDemo2{
/**
1.隊列 名稱
2.隊列的屬性 DISPATCH_QUEUE_SERIAL 標識串行
*/
dispatch_queue_t q =dispatch_queue_create(@"lsgcd", NULL);
//異步執(zhí)行任務
for (int i=0; i<10; i++) {
NSLog(@"%d---------",i);
dispatch_async(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//主線程任務
NSLog(@"over");
}
//并發(fā)隊列 異步執(zhí)行
- (void)gcdDemo3{
/**
1.隊列 名稱
2.隊列的屬性 DISPATCH_QUEUE_CONCURRENT 標識并行
*/
dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);
//異步執(zhí)行任務
for (int i=0; i<10; i++) {
// NSLog(@"%d---------",i);
dispatch_async(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//主線程任務
NSLog(@"over");
}
//并發(fā)隊列 同步執(zhí)行
//不會開啟線程 循序執(zhí)行
- (void)gcdDemo4{
/**
1.隊列 名稱
2.隊列的屬性 DISPATCH_QUEUE_CONCURRENT 標識并行
*/
dispatch_queue_t q =dispatch_queue_create(@"lsgcd", DISPATCH_QUEUE_CONCURRENT);
//異步執(zhí)行任務
for (int i=0; i<10; i++) {
// NSLog(@"%d---------",i);
dispatch_sync(q, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
//主線程任務
NSLog(@"over");
}
#pragma mark 同步任務
//作用:在開發(fā)中 通常將耗時操作 放在后臺執(zhí)行,有些任務彼此有’依賴‘關系
//例子:登錄 支付 下載
- (void)gcdDemo5{
dispatch_queue_t loginQueue =dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(loginQueue, ^{
NSLog(@"用戶登錄 %@",[NSThread currentThread]);
});
dispatch_async(loginQueue, ^{
NSLog(@"用戶支付 %@",[NSThread currentThread]);
});
dispatch_async(loginQueue, ^{
NSLog(@"用戶下載 %@",[NSThread currentThread]);
});
}
//增強版同步任務
//可以讓隊列調度多個任務前 指定一個同步任務 讓所有的異步w任務,等待同步任務執(zhí)行完成,這就是依賴關系
//同步任務會造成一個死鎖
- (void)gcdDemo6{
//隊列
dispatch_queue_t loginQueue = dispatch_queue_create(@"lsGCD", DISPATCH_QUEUE_CONCURRENT);
void(^task)() = ^{
for (int i=0 ; i <10; i++) {
NSLog(@"%d %@",i,[NSThread currentThread]);
}
dispatch_sync(loginQueue, ^{
NSLog(@"用戶登錄 %@",[NSThread currentThread]);
});
dispatch_async(loginQueue, ^{
NSLog(@"用戶支付 %@",[NSThread currentThread]);
});
dispatch_async(loginQueue, ^{
NSLog(@"用戶下載 %@",[NSThread currentThread]);
});
};
dispatch_async(loginQueue, task);
}