预定的时间延迟

时间:2014-02-08 19:21:17

标签: ios objective-c nsdate xcode5

我正在尝试在代码中启动延迟,以便当操作到达代码的那一部分时,只要延迟被安排,一切都会停止。我已经设置了时间延迟,这只是代码应该如何执行的问题。

这是我在项目中使用的时间延迟:

NSDate *timeDelay = [NSDate dateWithTimeIntervalSinceNow:5];
[NSThread sleepUntilDate:timeDelay];

如您所见,此代码段输入5秒延迟。我遇到的问题是,当我使用这个代码时,它没有做我期望它做的事情。以下是我正在尝试运行的功能:

- (IBAction)executeProgram
{
    UIAlertView *delayAlert = [[UIAlertView alloc]
                                initWithTitle:@"Delay"
                                message:@"This message follows with a 5 second delay."
                                delegate:nil
                                cancelButtonTitle:nil
                                otherButtonTitles:nil, nil];

    // Enable when time is working properly
    [delayAlert show];

    NSDate *timeDelay = [NSDate dateWithTimeIntervalSinceNow:5];
    [NSThread sleepUntilDate:timeDelay];

    // dismisses the alert
    [delayAlert dismissWithClickedButtonIndex:0 animated:YES];
}

我希望首先显示此代码,显示警报,等待5秒,然后关闭警报。但是,这不会发生。相反发生的事情是,当我点击按钮时,有一个5秒的延迟第一次,然后警报弹出并几乎立即解散自己。我已经尝试了另一段时间延迟的代码片段,并做出同样的反应。

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

for (int x = 0; x<=5000; x++)
{
    NSLog(@"%i",x);
}

CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();
CFAbsoluteTime elapsedTime = endTime - startTime;

我在这里做错了什么?为什么延迟会在警报弹出之前执行?

1 个答案:

答案 0 :(得分:4)

那是因为你正在睡眠(并阻塞)应该呈现警报的线程(主/ UI线程)。我建议您使用dispatch_after异步睡眠,然后在经过5秒后回调主线程以关闭警报。像这样:

UIAlertView *delayAlert = [[UIAlertView alloc]
                            initWithTitle:@"Delay"
                            message:@"This message follows with a 5 second delay."
                            delegate:nil
                            cancelButtonTitle:nil
                            otherButtonTitles:nil, nil];

[delayAlert show];

double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [delayAlert dismissWithClickedButtonIndex:0 animated:YES];
});