- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在显示一个 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/
dispatch_after 是否将操作放入队列中?也就是说,如果我在多次调用后调用 dispatch_after 来回调用,它们是否会像延迟后每个调用都放在 dispatch_async 中一样执行
我正在显示一个 UIView,以显示有关用户标记用于其他目的(例如删除或编辑)的 map 要素的信息。标记功能后,我会显示一个包含信息和撤消选项的 UIView。在固定的时间内显示 UIView 已经
是否有可能使这个“更清晰”或“更好”?欢迎任何解决方案,甚至认为我得到了正确答案。 问题是 popTime==0 的 dispatch_after() 仍然给主线程时间来进行一些 UI 更改。以下代码
我正在设置一个计时器,以便在一秒钟后为我的键盘扩展重置一个值。问题是我觉得下面的调用正在拖延我的 UI: dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
这是我第一次使用 GCD,我承认,如果我犯了傻,我深表歉意。我有一个 dispatch_after 命令,它对我来说是一个方便的延迟。 我的问题是当我发送 dispatch_after(5000000
我目前正在做一个项目,其中一部分我需要在一段时间后取消突出显示一个按钮。我决定使用 dispatch_after。 我已经设法让它工作了,但是有人能解释一下这行代码是如何工作的吗?我一直无法理解 di
我使用动画来指定提示,以帮助延迟交互: let delay = 1.8 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TI
请考虑以下简单示例: - (void)viewDidLoad { [super viewDidLoad]; dispatch_after(dispatch_time(DISPATCH_TIME
这是我需要做的: 类似于: for int i = 0; i < 3; i++) call method @selector(spin) with delay 0.1 //once this is d
我在方法中有以下代码: int64_t delayInSeconds = 2.0f; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW
在 viewDidLoad 的 MyViewController 中,我只有一个调用: - (void)viewDidLoad { [super viewDidLoad]; // Do
像这样很容易延迟执行 double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, d
这是我编写的用于将 NSTimeInterval 转换为基于 walltime 的 dispatch_time_t 的结构: public struct WallTimeKeeper { pu
我开发了一种方法,每 3 秒显示一个移动的图像。我使用 dispatch_after 进行制作,但在应用程序的每次执行中,显示图像的距离或时间都是不同的。将 NSTimer 与 Schedule 一起
我想要一个包含 dispatch_after 语句的 for 循环。问题是 dispatch_after 调用似乎与 for 循环不一致。换句话说,我希望它仅在 dispatch_after bloc
我正在尝试创建一个这样的循环: while (TRUE){ dispatch_after(...{ }); } 在 viewDidLoad 之后。这个想法是反复重复 dispatch
这里是 Swift/SO 新手 - 会尽量说清楚! 我有一个 @IBAction 从 wkinterfacepicker 调用。这会调用一个函数,该函数可能会再次更改选择器 - 这反过来会导致 @IB
我正在编写一个将同时执行多项任务的应用程序。一项特定任务是每 200 毫秒执行一次。为此,我使用了两种相互调用的方法。第一个方法只调用第二个,第二个方法使用 dispatch_after() 延迟调用
这是我的问题。当我的应用程序进入后台时,我希望它在一段时间后执行一个功能。这就是我所做的: - (void)applicationDidEnterBackground:(UIApplication *
这个问题在这里已经有了答案: Prevent dispatch_after() background task from being executed (11 个答案) 关闭 7 年前。 有没有办法
我是一名优秀的程序员,十分优秀!