如何等待异步调度块完成?

如何等待异步调度块完成?

我正在测试一些使用Grand Central Dispatch进行异步处理的代码。测试代码如下所示:

[object runSomeLongOperationAndDo:^{
    STAssert…}];

测试必须等待操作完成。我目前的解决方案如下:

__block BOOL finished = NO;[object runSomeLongOperationAndDo:^{
    STAssert…
    finished = YES;}];while (!finished);

看起来有点粗糙,你知道更好的方法吗?我可以通过调用暴露队列然后阻塞dispatch_sync

[object runSomeLongOperationAndDo:^{
    STAssert…}];dispatch_sync(object.queue, ^{});

......但是这可能会暴露太多object


慕无忌1623718
浏览 680回答 3
3回答

梦里花落0921

我最近再次讨论这个问题并写了以下类别NSObject:@implementation NSObject (Testing)- (void) performSelector: (SEL) selector     withBlockingCallback: (dispatch_block_t) block{     dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);     [self performSelector:selector withObject:^{         if (block) block();         dispatch_semaphore_signal(semaphore);     }];     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);     dispatch_release(semaphore);}@end通过这种方式,我可以轻松地将异步调用与回调转换为测试中的同步调用:[testedObject performSelector:@selector(longAsyncOpWithCallback:)     withBlockingCallback:^{     STAssert…}];
打开App,查看更多内容
随时随地看视频慕课网APP