- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我编写的用于将 NSTimeInterval 转换为基于 walltime 的 dispatch_time_t 的结构:
public struct WallTimeKeeper {
public static func walltimeFrom(spec: timespec)->dispatch_time_t {
var mutableSpec = spec
let wallTime = dispatch_walltime(&mutableSpec, 0)
return wallTime
}
public static func timeStructFrom(interval: NSTimeInterval)->timespec {
let nowWholeSecsFloor = floor(interval)
let nowNanosOnly = interval - nowWholeSecsFloor
let nowNanosFloor = floor(nowNanosOnly * Double(NSEC_PER_SEC))
println("walltimekeeper: DEBUG: nowNanosFloor: \(nowNanosFloor)")
var thisStruct = timespec(tv_sec: Int(nowWholeSecsFloor),
tv_nsec: Int(nowNanosFloor))
return thisStruct
}
}
我一直在尝试在 Playground 中测试它的准确性,但我的结果让我感到困惑。
这是我的 Playground 中的代码(我的 WallTimeKeeper 在 Sources 文件夹中):
var stop = false
var callbackInterval: NSTimeInterval?
var intendedTime: NSDate?
var intendedAction: ()->() = {}
func testDispatchingIn(thisManySeconds: NSTimeInterval){
intendedTime = NSDate(timeIntervalSinceNow: thisManySeconds)
intendedAction = stopAndGetDate
dispatchActionAtDate()
loopUntilAfterIntendedTime()
let success = trueIfActionFiredPunctually() //always returns false
}
func dispatchActionAtDate(){
let timeToAct = dateAsDispatch(intendedTime!)
let now = dateAsDispatch(NSDate())
/*****************
NOTE: if you run this code in a Playground, comparing the above two
values will show that WallTimeKeeper is returning times the
correct number of seconds apart.
******************/
dispatch_after(timeToAct, dispatch_get_main_queue(), intendedAction)
}
func loopUntilAfterIntendedTime() {
let afterIntendedTime = intendedTime!.dateByAddingTimeInterval(1)
while stop == false && intendedTime?.timeIntervalSinceNow > 0 {
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode,
beforeDate: afterIntendedTime)
}
}
func trueIfActionFiredPunctually()->Bool{
let intendedInterval = intendedTime?.timeIntervalSinceReferenceDate
let difference = intendedInterval! - callbackInterval!
let trueIfHappenedWithinOneSecondOfIntendedTime = abs(difference) < 1
return trueIfHappenedWithinOneSecondOfIntendedTime
}
func dateAsDispatch(date: NSDate)->dispatch_time_t{
let intendedAsInterval = date.timeIntervalSinceReferenceDate
let intendedAsStruct = WallTimeKeeper.timeStructFrom(intendedAsInterval)
let intendedAsDispatch = WallTimeKeeper.walltimeFrom(intendedAsStruct)
return intendedAsDispatch
}
func stopAndGetDate() {
callbackInterval = NSDate().timeIntervalSinceReferenceDate
stop = true
}
testDispatchingIn(3)
...所以不仅 trueIfActionFiredPunctually()
总是返回 false,而且 difference
值——旨在测量回调触发时间与应该触发的时间——成功的结果应该非常接近 0,当然低于 1——结果与回调的时间量几乎完全相同应该等待开火。
总而言之:定义了等待的时间量,并设置了在该时间量后触发的操作。当 Action 触发时,它会创建触发时刻的时间戳。当将时间戳与其应有的值进行比较时,我们并没有接近零,而是接近了我们应该等待的时间。
换句话说,似乎传递给 dispatch_after
的操作立即触发,这绝对不应该!
这是 Playgrounds 有问题还是我的代码有问题?
编辑:这是代码。在实时应用程序中运行相同的代码会得到相同的结果。我做错了什么?
最佳答案
我想通了。这是一个令人头疼的问题。如果有人遇到同样的问题,我会保留它。
我正在使用 NSDate().timeIntervalSinceReferenceDate
来设置我的挂钟时间。
Walltimes 需要 NSDate().timeIntervalSince1970
!
dispatch_after 任务全部立即触发,因为它们认为它们在四十多年前就已经安排好了!
将所有内容更改为 NSDate().timeIntervalSince1970
使其完美运行。
道德:除非您确定引用日期是 1970 年,否则不要使用挂钟时间!
关于ios - 为什么这个 dispatch_after 会立即触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629120/
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 年前。 有没有办法
我是一名优秀的程序员,十分优秀!