预定时间延迟 [重复]

Posted

技术标签:

【中文标题】预定时间延迟 [重复]【英文标题】:Scheduled Time Delay [duplicate] 【发布时间】:2014-02-08 19:21:17 【问题描述】:

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

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

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

如你所见,这个 sn-p 输入了 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 秒,然后关闭警报。然而,这不会发生。相反,当我点击按钮时,first 有 5 秒的延迟,然后警报弹出并几乎立即自行消失。我已经用另一个 sn-p 代码尝试了这个时间延迟,反应相同。

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

for (int x = 0; x<=5000; x++)

    NSLog(@"%i",x);


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

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

【问题讨论】:

附带说明,像这样强制用户盯着警报视图一段时间会导致体验不佳,并且可能会在 HIG 中受到警告。 @joshcaswell 这不是我打算发布到 App Store 的应用程序,而是我将用于个人用途的应用程序。 @JoshCaswell 另一个问题是类似的,所以感谢您向我指出。我不知道它的存在。 【参考方案1】:

那是因为您正在休眠(并阻塞)应该从(主/UI 线程)呈现警报的线程。推荐你使用dispatch_after异步休眠,5秒后回调主线程解除alert。像这样的:

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];
);

【讨论】:

以上是关于预定时间延迟 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

小米和OPPO等中国ROM的工作管理器,在电池优化时,将预定的工作延迟增加几个小时

预定义参数 [重复]

要填写的预定义日期范围[重复]

用于替换长预定义参数的 Shell 脚本 [重复]

如何按预定义的秒数终止异步任务请求[重复]

重学正则-量词符和预定义类的使用