通过GCD延迟休眠()

时间:2013-09-10 09:34:14

标签: ios objective-c grand-central-dispatch

我有一种方法,每次调用它时我需要延迟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];
             }
        });
    });
}

2 个答案:

答案 0 :(得分:2)

  

此程序的第一次调用会延迟约5秒,但其他   这个队列中的呼叫一个接一个地没有延迟。

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

GCD提供了一个很好的dispatch_group_wait()功能,可让您完成一组任务等待其他组完成。请查看Waiting on Groups of Queued Tasks示例。

答案 1 :(得分:1)

dispatch_barrier_async仅阻止在此块运行后添加到并发队列的块。已排队的块不会被阻止运行。