2016-11-10 65 views
0

我怎么称呼不当dispatch_async电话里面dispatch_async嵌套dispatch_async(另一dispatch_async内dispatch_async)

dispatch_group_t downloadQueue = dispatch_group_create(); 
dispatch_group_async(downloadQueue,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

NSLog(@"Main"); 
[NSThread sleepForTimeInterval:5.0]; 
NSLog(@"End"); 

    [self myMethod]; 

}); 
dispatch_group_notify(downloadQueue,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{ 

    NSLog(@"FINAL"); 

}); 

这里是myMethod的:

-(void)myMethod 
{ 
    dispatch_group_t group = dispatch_group_create(); 
    dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block1 
     NSLog(@"Block1"); 
     [NSThread sleepForTimeInterval:5.0]; 
     NSLog(@"Block1 End"); 
    }); 
    dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block2 
     NSLog(@"Block2"); 
     [NSThread sleepForTimeInterval:8.0]; 
     NSLog(@"Block2 End"); 
    }); 

    dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block3 
     NSLog(@"Block3"); 
    }); 
} 

和我的输出是:
主要
结束
Block1
块2
FINAL
块1结束
块2结束
块3

,但我需要
主要

块1
块2
块1结束
块2结束
块3
FINAL

+0

你的问题是'myMethod'是异步的,所以它会派遣它的块,然后返回,退出外部调度组。使用dispatch_group_enter和dispatch_group_leave,而不是dispatch_group_async – Paulw11

回答

0

可以在myMethod istead dispatch_group_notify的使用dispatch_group_wait。这样,只有当dispatch_group_async完成执行时,您的方法才会返回。

1

你只需要通知你的群组myMethod。你的代码将是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

    NSLog(@"Main"); 
    [NSThread sleepForTimeInterval:5.0]; 
    NSLog(@"End"); 

    dispatch_group_notify([self myMethod],dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^{ 

     NSLog(@"FINAL"); 

    }); 
}); 

-(dispatch_group_t)myMethod{ 

    dispatch_group_t group = dispatch_group_create(); 

    dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block1 
     NSLog(@"Block1"); 
     [NSThread sleepForTimeInterval:5.0]; 
     NSLog(@"Block1 End"); 
    }); 


    dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block2 
     NSLog(@"Block2"); 
     [NSThread sleepForTimeInterval:8.0]; 
     NSLog(@"Block2 End"); 
    }); 

    dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // block3 
     NSLog(@"Block3"); 
    }); 
    return group; 
}