通过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
只停止在该块运行后添加到并发队列中的块。 已排队的块不会阻止运行。