我正在尝试在代码中启动延迟,以便当操作到达代码的那一部分时,只要延迟被安排,一切都会停止。我已经设置了时间延迟,这只是代码应该如何执行的问题。
这是我在项目中使用的时间延迟:
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;
我在这里做错了什么?为什么延迟会在警报弹出之前执行?
答案 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];
});