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完成
有一种情况要注意下,任务是异步执行的情况,不会等到异步的任务完成再执行依赖的任务。
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,可以继续执行任务
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,可以继续执行任务
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,可以继续执行任务
dispatch_semaphore_signal(semaphore);
});
});
dispatch_async(queue, ^{
///信号量-1,1-1=0
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务3完成");
//信号量+1,0+1=1,可以继续执行任务
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完成
网友评论