故事背景:
假设有四个任务A、B、C、D ,它们之间存在如下依赖关系:A->C, B->C, C->D。如何实现这个应用场景。
解决方案一:GCD
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{
NSLog(@"%@ %@ : task A ", [NSThread currentThread], NSStringFromSelector(_cmd));
});
dispatch_group_async(group, queue, ^{
NSLog(@"%@ %@ : task B ", [NSThread currentThread], NSStringFromSelector(_cmd));
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_queue_t queue2 = dispatch_queue_create("com.lh.serizalqueue", 0);
dispatch_async(queue2, ^{
NSLog(@"%@ %@ : task C ", [NSThread currentThread], NSStringFromSelector(_cmd));
});
dispatch_async(queue2, ^{
NSLog(@"%@ %@ : task D ", [NSThread currentThread], NSStringFromSelector(_cmd));
});
方案二:NSOperation
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ %@ : task A ", [NSThread currentThread], NSStringFromSelector(_cmd));
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ %@ : task B ", [NSThread currentThread], NSStringFromSelector(_cmd));
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ %@ : task C ", [NSThread currentThread], NSStringFromSelector(_cmd));
}];
NSBlockOperation *operationD = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@ %@ : task D ", [NSThread currentThread], NSStringFromSelector(_cmd));
}];
[operationC addDependency:operationA];
[operationC addDependency:operationB];
[operationD addDependency:operationC];
[operationQueue addOperation:operationA];
[operationQueue addOperation:operationB];
[operationQueue addOperation:operationC];
[operationQueue addOperation:operationD];
网友评论