通过GCD延迟睡眠()

每次我打电话时,我都有需要延迟5秒的方法。 首先我要sleep(5); – 它运作良好,但我相信 – 这不是客观的方式,所以我试图用GCD的帮助来写它。 这个程序的第一个呼叫延迟约5秒,但这个队列中的其他呼叫将一个接一个地延迟。 如何解决这个问题呢?

 - (void) buyItemAtUUID:(NSString*)UUID { dispatch_barrier_async(dataManagerQueue, ^{ [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; double delayInSeconds = 5.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dataManagerQueue, ^(void){ NSInteger path = [self indexFromObjectUUID:UUID]; if (path != NSNotFound) { NSMutableDictionary *item = [[_items objectAtIndex:path] mutableCopy]; NSNumber *value = [NSNumber numberWithFloat:[[item objectForKey:@"Quantity"] floatValue] - 1.0]; } }); }); } 

这个程序的第一个呼叫延迟约5秒,但这个队列中的其他呼叫将一个接一个地延迟。

这通常是期望的行为。 你不应该调用sleep()的原因是它会阻塞线程,阻止该线程中的其他任何事情发生。 如果您阻止主线程,您的设备将显示冻结,这不是一个非常好的用户体验。

GCD提供了一个很好的dispatch_group_wait()函数,让您可以让一组任务等待其他组完成。 看看等待排队任务组为例。

dispatch_barrier_async只停止该块运行添加到并发队列中的块。 已排队的块不会阻止运行。