我有一个方法,我添加到我创建的GCD队列(所以它是一个串行队列),然后运行它的异步。从那段代码中,我派遣到主队列,当派发到主队列的代码块完成时,我将一个BOOL标志设置为YES,这样我在代码中进一步下来可以检查这个条件是否为YES那么我可以继续下一个方法。下面是短代码:等待的条件继续
dispatch_queue_t queue = dispatch_queue_create("ProcessSerialQueue", 0);
dispatch_async(queue, ^{
Singleton *s = [Singleton sharedInstance];
dispatch_sync(dispatch_get_main_queue(), ^{
[s processWithCompletionBlock:^{
// Process is complete
processComplete = YES;
}];
});
});
while (!processComplete) {
NSLog(@"Waiting");
}
NSLog(@"Ready for next step");
然而,这是不行的,因为dispatch_sync从来都不是能够在主队列运行代码。这是因为我在主队列上运行一个while循环(使其处于繁忙状态)?
但是,如果我改变而循环的实现这样:
while (!processComplete) {
NSLog(@"Waiting")
NSDate *date = [NSDate distantFuture];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date];
}
它工作无故障。这是这种情况下可接受的解决方案吗?我可以做任何其他首选的方式吗? NSRunLoop
做什么样的魔术?我需要更好地理解这一点。
所以,如果我不是要从主队列(主线程)进行回调,我可以使用派遣信号量(http://stackoverflow.com/q/4326350/294661)或甚至使用我的解决方案(无需手动调用runloop)? –
是的......尽管如果你在一个串行队列中,那么提交到该队列的任何块将不会运行,直到块结束。为什么你需要根本阻止线程?你需要从调用方法返回一个值吗? –
我需要等待一个过程才能完成,然后才能继续。不,我不需要返回一个值。 –