一、任務(wù)和隊列
1.同步任務(wù) ?dispatch_sync ?不可以開啟新線程
dispatch_queue_tqueue =dispatch_queue_create("123",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
//同步
});
});
2.異步任務(wù) dispatch_async 可以開啟新的線程
dispatch_queue_tqueue =dispatch_queue_create("123",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
//異步
});
});
//主線程主隊列+同步任務(wù)會造成死鎖的現(xiàn)象切記不能再主隊列里面添加同步任務(wù)
dispatch_sync(_queue,^{
dispatch_sync(_queue,^{
//do something
});
})
二、GCD的應(yīng)用
1-》用于加載圖片
dispatch_queue_tqueue =dispatch_queue_create("123",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSData*date = [NSDatadataWithContentsOfURL:[NSURLURLWithString:@""]];
UIImage*image = [UIImageimageWithData:date];
dispatch_async(dispatch_get_main_queue(), ^{
//異步
UIImageView*imagesView = [UIImageViewnew];
imagesView.image= image;
});
});
2-》可以用于延時加載
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
//延時加載
UIImageView*imagesView = [UIImageViewnew];
imagesView.image= [UIImageimageNamed:@""];
});
3-》可以用于 按秩序 執(zhí)行代碼
dispatch_group_tgroup =dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSLog(@"11111");
});
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSLog(@"22222");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
//在前面兩個任務(wù)執(zhí)行完后發(fā)送通知執(zhí)行3333
NSLog(@"3333");
});
4-》 執(zhí)行一次的代碼 比如單例的創(chuàng)建 和 引導(dǎo)頁
單例:(也可以用加鎖的方式創(chuàng)建)
staticMyViewController*viewVC =nil;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
viewVC = [[[selfclass]alloc]init]; //只執(zhí)行一次
});
5-》多次執(zhí)行 某段代碼
dispatch_apply(10,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(size_t index) { //index 指的是下標(biāo)
NSLog(@"index == %zu",index);
});//多次執(zhí)行