搜索
您的当前位置:首页正文

从任务依赖这件小事说起

来源:二三娱乐

故事背景:

假设有四个任务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];
Top