我有一个方法,我添加到我创建的 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 循环的实现更改为:
while (!processComplete) {
NSLog(@"Waiting")
NSDate *date = [NSDate distantFuture];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date];
}
它可以正常工作。对于这种情况,这是一个可接受的解决方案吗?我可以用其他首选方式吗?有什么神奇的东西可以NSRunLoop
做?我需要更好地理解这一点。