2

我有一种方法,每次调用它时都需要延迟 5 秒。首先,我使用它sleep(5);——它工作得很好,但我相信——它不是 obj-c 方式,所以我尝试在 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];
             }
        });
    });
}
4

2 回答 2

2

此过程的第一次调用会延迟大约 5 秒,但此队列中的其他调用会一个接一个地进行,没有延迟。

这通常是期望的行为。您不应该调用的原因sleep()是它会阻塞线程,从而阻止该线程中的其他任何事情发生。如果你阻塞了主线程,你的设备会出现死机,这不是一个很好的用户体验。

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

于 2013-09-10T09:48:43.107 回答
1

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

于 2013-09-10T09:57:15.423 回答