iOS GCD与NSOperation对于复杂任务的处理

199 阅读1分钟

业务说明:

A,B,C,D,E,F五个任务,ABC为三个耗时任务并发执行,D任务等待AB任务均完成后执行,E任务等待BC任务均完成后执行,F任务等待DE任务均完成后执行

GCD

#import "dispatch.h"

@implementation dispatch

-(void)done{
    dispatch_group_t groupD = dispatch_group_create();
    dispatch_group_t groupE = dispatch_group_create();
    dispatch_group_t groupF = dispatch_group_create();
    
    dispatch_group_enter(groupD);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //A to do
        dispatch_group_leave(groupD);
    });
    
    dispatch_group_enter(groupD);
    dispatch_group_enter(groupE);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //B to do
        dispatch_group_leave(groupD);
        dispatch_group_leave(groupE);
    });
    dispatch_group_enter(groupE);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //C to do
        dispatch_group_leave(groupE);
    });
    
    dispatch_group_enter(groupF);
    dispatch_group_notify(groupD, dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //D to do
        dispatch_group_leave(groupF);
    });
    
    dispatch_group_enter(groupF);
    dispatch_group_notify(groupE, dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //E to do
        dispatch_group_leave(groupF);
    });
    
    dispatch_group_notify(groupF, dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        //F to do
    });
};
@end

NSOperation

#import "Operation.h"

@implementation Operation

-(void)done{
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //A to do
    }];
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //B to do
    }];
    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //C to do
    }];
    NSBlockOperation *operationD = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //D to do
    }];
    NSBlockOperation *operationE = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //E to do
    }];
    NSBlockOperation *operationF = [NSBlockOperation blockOperationWithBlock:^{
        sleep(3);
        //F to do
    }];
    
    [operationD addDependency:operationA];
    [operationD addDependency:operationB];
    
    [operationE addDependency:operationB];
    [operationE addDependency:operationC];
    
    [operationF addDependency:operationD];
    [operationF addDependency:operationE];
    
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc]init];
    
    [operationQueue addOperation:operationA];
    [operationQueue addOperation:operationB];
    [operationQueue addOperation:operationC];
    [operationQueue addOperation:operationD];
    [operationQueue addOperation:operationE];
    [operationQueue addOperation:operationF];
};
@end