我有一种方法,每次调用它时我需要延迟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];
}
});
});
}
答案 0 :(得分:2)
此程序的第一次调用会延迟约5秒,但其他 这个队列中的呼叫一个接一个地没有延迟。
这通常是期望的行为。你不应该调用sleep()
的原因是它会阻塞线程,阻止该线程中的任何其他事件发生。如果您阻止主线程,您的设备将显示为冻结,这不是一个非常好的用户体验。
GCD提供了一个很好的dispatch_group_wait()
功能,可让您完成一组任务等待其他组完成。请查看Waiting on Groups of Queued Tasks示例。
答案 1 :(得分:1)
dispatch_barrier_async
仅阻止在此块运行后添加到并发队列的块。已排队的块不会被阻止运行。