1.使用NSOperation
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSBlockOperation *task1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任務1完成");
}];
[queue addOperation:task1];
NSBlockOperation *task2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任務2完成");
}];
[task2 addDependency:task1];
[queue addOperation:task2];
NSBlockOperation *task3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任務3完成");
}];
[task3 addDependency:task2];
[queue addOperation:task3];
打印輸出
2018-07-25 17:17:46.994811+0800 CoreAnimationLearn[20897:305719] 任務1完成
2018-07-25 17:17:46.995069+0800 CoreAnimationLearn[20897:305716] 任務2完成
2018-07-25 17:17:46.995889+0800 CoreAnimationLearn[20897:305716] 任務3完成
有一種情況要注意下,任務是異步執(zhí)行的情況,不會等到異步的任務完成再執(zhí)行依賴的任務。
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSBlockOperation *task1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任務1完成");
}];
[queue addOperation:task1];
NSBlockOperation *task2 = [NSBlockOperation blockOperationWithBlock:^{
/// 使用dispatch_after模仿異步操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"任務2完成");
});
}];
[task2 addDependency:task1];
[queue addOperation:task2];
NSBlockOperation *task3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任務3完成");
}];
[task3 addDependency:task2];
[queue addOperation:task3];
打印輸出
2018-07-25 17:37:21.965293+0800 CoreAnimationLearn[21085:315994] 任務1完成
2018-07-25 17:37:21.965594+0800 CoreAnimationLearn[21085:315990] 任務3完成
2018-07-25 17:37:23.965703+0800 CoreAnimationLearn[21085:315933] 任務2完成
2.針對這種情況,可以使用信號量dispatch_semaphore_t解決
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
///初始化信號量為1,可以繼續(xù)執(zhí)行任務
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_async(queue, ^{
///信號量-1,1-1=0
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任務1完成");
///信號量+1,0+1=1,可以繼續(xù)執(zhí)行任務
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
///信號量-1,1-1=0
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
/// 使用dispatch_after模仿異步操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"任務2完成");
//信號量+1,0+1=1,可以繼續(xù)執(zhí)行任務
dispatch_semaphore_signal(semaphore);
});
});
dispatch_async(queue, ^{
///信號量-1,1-1=0
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任務3完成");
//信號量+1,0+1=1,可以繼續(xù)執(zhí)行任務
dispatch_semaphore_signal(semaphore);
});
打印輸出
2018-07-25 17:45:34.546537+0800 CoreAnimationLearn[21163:320756] 任務1完成
2018-07-25 17:45:36.735362+0800 CoreAnimationLearn[21163:320706] 任務2完成
2018-07-25 17:45:36.735520+0800 CoreAnimationLearn[21163:320759] 任務3完成