gpt4 book ai didi

ios - 具有滑动或可重置延迟的 dispatch_after

转载 作者:行者123 更新时间:2023-11-28 18:58:34 28 4
gpt4 key购买 nike

我正在显示一个 UIView,以显示有关用户标记用于其他目的(例如删除或编辑)的 map 要素的信息。标记功能后,我会显示一个包含信息和撤消选项的 UIView。在固定的时间内显示 UIView 已经完成并且可以正常工作,但是,我希望延迟有一个滑动到期时间,也就是说,如果用户选择另一个 map 功能进行标记,则延迟应该自行重置并且 UIView 应该在指定的全部时间内保持可见。我正在寻找的是滑动到期。到目前为止我的代码:

double delaySeconds = 15;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self toggleUndoViewToShow:NO];
});

所以,我的延迟时间是 15 秒,如果在这 15 秒内标记了另一个功能,我希望 View 在整个延迟时间内保持可见。我该怎么办?谢谢!

最佳答案

使用计时器调度源。使用 dispatch_source_create() 创建它,传递 DISPATCH_SOURCE_TYPE_TIMER 作为类型。调用 dispatch_source_set_timer() 设置开始时间。要模拟只运行一次任务的 dispatch_after(),请使用 DISPATCH_TIME_FOREVER 作为间隔。调用dispatch_source_set_event_handler() 设置任务在指定时间到达时执行。此外,该任务需要使用 dispatch_source_cancel() 取消源以清理源。在源上调用 dispatch_resume() 以允许它继续(它是在挂起状态下创建的)。

您可以随时使用 dispatch_source_set_timer() 来调整任务运行的时间。您也可以随时取消它。

由于这比 dispatch_after() 稍微复杂一些,您可以将其包装在一个帮助程序中,以便为您进行设置。辅助函数的调用者将提交一个不知道需要取消源的任务 block 。您的助手会将其包装在调用提供的 block 的任务中,然后执行 dispatch_source_cancel()


对于您需要的非常简单的情况,上述内容可能有点矫枉过正。你也可以这样做:

__block int savedTaskID;
if ([NSThread isMainThread])
savedTaskID = ++self.currentTaskID; // an integer property on your view
else dispatch_sync(dispatch_get_main_queue(), ^{
savedTaskID = ++self.currentTaskID;
});

double delaySeconds = 15;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (savedTaskID == self.currentTaskID)
[self toggleUndoViewToShow:NO];
});

如果您想延迟切换,只需重复上述步骤即可。由于这会增加 currentTaskID,因此当先前提交的任务运行时,它们什么都不做。这有点浪费,因为绝育任务仍然存在并最终运行,但听起来它不会发生太多。

关于ios - 具有滑动或可重置延迟的 dispatch_after,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28863974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com