dispatch_group_t
一組任務(wù)完成后再做其他處理沟绪,比如異步下載多張圖片科乎,等圖片下載完成后再拼接圖片顯示趴生,這種類似需求就可以用group來完成
1.一組同步任務(wù):
- (void)testGroup1
{
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.test.queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
sleep(3);
NSLog(@"sync 1 sleep 3s");
});
dispatch_group_async(group, queue, ^{
sleep(1);
NSLog(@"sync 2 sleep 1s");
});
//notify中的queue可以是任意一個(gè)queue短蜕,是希望處理block中任務(wù)的queue
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"all sync done");
});
}
2.一組異步任務(wù)
- (void)testGroup2
{
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.test.queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(3);
NSLog(@"async 1 sleep 3s");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(1);
NSLog(@"async 2 sleep 1s");
dispatch_group_leave(group);
});
//阻塞當(dāng)前線程,直到指定超時(shí)時(shí)間(DISPATCH_TIME_FOREVER 永久阻塞)
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5*NSEC_PER_SEC)));
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"all async done");
}
- (void)testGroup3
{
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.test.queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(3);
NSLog(@"sync 1 sleep 3s");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(1);
NSLog(@"sync 2 sleep 1s");
dispatch_group_leave(group);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"all sync done");
});
}
dispatch_barrier_async
在它前面加入的同一隊(duì)列的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行碌尔,而且它后面加入的同一隊(duì)列的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"dispatch_async1");
});
dispatch_async(globalQueue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async2");
});
dispatch_barrier_async(globalQueue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_barrier_async");
});
dispatch_async(globalQueue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async3");
});
dispatch_apply
循環(huán)執(zhí)行某個(gè)任務(wù)指定次數(shù)
dispatch_apply(6, dispatch_get_global_queue(0, 0), ^(size_t index) {
NSLog(@"執(zhí)行:%zu", index);
});