- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有下面的代码,它根据存储在 NSDefault 变量 checkOutTime
中的值初始化一个 NSTimer。
假设我将此变量中的时间更改为过去的时间(当前时间之前)并重新初始化计时器,它会自动触发并调用 ForceCheckOut()
回调方法。
我需要计时器仅在给定的触发日期触发。
func InitilizeAutoCheckOut(isExtendedCheckout:Bool)
{
let checkOutTime = self.defaults.valueForKey("checkOutTime") as! String
print(checkOutTime)
if !checkOutTime.isEmpty
{
let date = self.StringToDate(checkOutTime, IsExtendedCheckout: isExtendedCheckout)
print(date)
let autoCheckOutTimer = NSTimer(fireDate: date, interval: 24*60*60, target: self, selector: #selector(DashboardViewController.ForceCheckOut), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(autoCheckOutTimer, forMode: NSDefaultRunLoopMode)
}
}
最佳答案
正如在几个地方 (here is a good example) 中所解释的,NSTimer
的 fireDate
实际上并不是计时器触发的日历日期时间。将其视为一种请求倒计时的机制更为准确。值得注意的是,NSTimer
不考虑时钟重置、背景等。它基本上计算一个数字,直到它应该触发,定期递减该数字,并在该数字 <= 0 时触发。更改本地时钟不会影响该数字,并且暂停进程(例如,通过后台运行应用程序)将导致倒计时从其当前值恢复,而不考虑它睡着的时间。这可以说是不直观的,因为 fireDate
强烈暗示“在这个日历日期开火”的契约(Contract),但 API 就是这样。
有了这些知识,您可以凭直觉知道您所看到的行为是预期的:如果您设置过去的日期,您实质上是在要求计时器从(负数)开始倒计时,因此计时器会立即识别满足触发条件(剩余时间 <= 0),并在被 runloop 唤醒后立即触发。
但即使没有这些知识,我也认为这种行为满足的期望多于它违背的期望。考虑:
The system reserves the right to apply a small amount of tolerance to certain timers regardless of the value of [tolerance]. -- NSTimer class ref.
如果您在未来很短的时间内安排一个计时器,则运行循环可能不会检查计时器,直到它的预定时间实际过去之后。通过触发定时器,即使时间已经过去,定时器或多或少会在指定时间触发,从而满足程序员的期望。
此外,您想要的行为会在管理计时器方面引入一系列复杂问题。如果您创建一个带有 future 触发日期的计时器,但在该触发日期过去之前不添加它会怎样?计时器应该触发还是不触发?当前的行为避免了该决定。
最简单的解决方案可能是在安排计时器之前检查触发日期,并且仅在触发日期满足您的条件时才将其添加到运行循环中:
let date = self.StringToDate(checkOutTime, IsExtendedCheckout: isExtendedCheckout)
let comparison = date.compare(NSDate())
guard comparison != .OrderedAscending else {
print("date \(date) has already passed. Not scheduling timer.")
return
}
关于ios - NSTimer 在 firedate 之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744608/
注意:我在这个项目中使用 swift。 我目前正在开发我的第一个项目,如果在一段时间后没有按下按钮,我会尝试停止(无效)NSTimer。我找到了其他停止 NSTimer 的方法,但没有说明如何在一定时
我正在 Xcode4 中工作,在一个项目中,出于组织目的,我一直使用三个不同的 NSTimer,但我意识到,除了名称之外,计时器是相同的,因此很容易将所有三个计时器合并为一。对于我的项目来说,哪一个更
根据 Apple 文档,将同时使用 WKInterfaceTimer(Watch 本地,倒计时但在结束时不触发任何事件)和 NSTimer(在计时器结束时触发方法)。所以,我的 App Interfa
我目前正在尝试制作一个 queueHandler,它将一个对象数组作为输入,用于在一个简单的 Double 机器人上执行驱动命令。我目前正在尝试使用 GCD 以串行执行我的函数,但是当我在我的队列中使
有个问题...我有定时器 [NSTimer scheduledTimerWithTimeInterval:120
我创建了一个计时器, self.scanTimer = [NSTimer scheduledTimerWithTimeInterval:TIMEOUT_SECONDS target:self s
我尝试使用以下代码停止 NSTimer: - (void)viewDidLoad { [super viewDidLoad]; timer3 = [NSTimer timerWithT
我正在制作一个带有计时器的应用程序。我从给定时间开始计算分钟和秒,直到 0。发生这种情况时,我启动一个警报 View 。 我的结构是这样的: 主线程方法分配一个新线程并初始化它。线程的入口点(方法)有
好吧,这段代码非常基本。用户将答案输入文本框,如果等于“第一+第二”,他们就得到一分。然后,他们有 5 秒钟的时间回答下一个数学问题。如果他们这样做了,函数“doCalculation”将再次运行,他
我正在创建益智游戏应用程序,并使用 NSTimer 显示时间(即 01:20)。当应用程序进入后台时,NSTimer 会暂停,但即使应用程序处于后台状态,我也想继续它。 例如,当应用程序进入后台时,计
我有一个带有 NSTimer *myTimer; 变量的类。在某些时候我会这样做: myTimer = [NSTimer scheduledTimerWithTimeInterval:20 targe
Edit2:为什么在“doSomething”方法中只更新了进度而不是point0? 编辑:使用我拥有的代码。我知道我一定忽略了一些东西,但我就是找不到它。 我正在编写一个 iPhone 应用程序,它
我的应用是一款体育应用。即使在后台游戏也应该继续,我为此使用了 nstimer。但我无法在后台运行计时器。每当应用程序处于后台时,计时器就会停止,返回时它会从离开时的同一时间继续。 最佳答案 您无法在
它将不断倒计时并更新当前时间。任何人都知道如何解决这个问题?我不明白 NStimer 如何识别这样的日期格式:20110803 23:59:59 最佳答案 查找NSDateFormatter 。您可以
是否可以在主线程上运行由 nstimer 调用的选择器? NSTimer 在它自己的线程中生成。 我的结构是一个线程调用一个带有 nstimer 的方法,nstimer 调用一个执行一些更新的方法,但
我在我的应用程序中使用了很多计时器。用于记录时间、移动物体、淡入淡出等。我在不同时间、同一 View 中使用同一个计时器来实现多个目的。我应该如何正确声明和无效或释放我的计时器? Atm 我这样声明计
我正在尝试使用 iPhone SDK 3.0 在线程上运行 NSTimer。我认为我做的一切都是正确的(新的运行循环等)。如果我在 viewDidDissappear 上调用 [timer inval
这是让我困惑了一段时间的事情。 我有一个 NSTimer,添加到 currentRunLoop 中,如果我不保留它,它就会崩溃。 NSTimer *timer = [[NSTimer timerWit
当我们使用 NSTimer 时,一旦在上述时间间隔后调用回调,UI 是否会被阻塞? 最佳答案 这要看情况。大多数时候,这不会成为问题。 如果,但是,满足以下两个条件,NSTimer 将阻塞 UI 线程
我使用大约 20 个 UIImageView 的小型飞机图像(50x50 像素)在 iPhone 屏幕上制作简单的动画。动画是通过按计时器间隔移动 UIImageView center 属性来完成的。
我是一名优秀的程序员,十分优秀!