使用 NSTimer 制作闹钟

Posted

技术标签:

【中文标题】使用 NSTimer 制作闹钟【英文标题】:Making alarm clock with NSTimer 【发布时间】:2012-07-02 09:13:28 【问题描述】:

我刚刚尝试制作一个带有本地通知的闹钟应用程序,但这并没有成功,因为我需要在 ios 5+ 中显示警报而不是进入通知中心

到目前为止,我一直在努力使用 nstimer 及其功能,所以我想知道是否有人可以提供帮助。

我希望当用户选择一个时间(通过 UIDatePicker,只有时间)以在这个时间显示警报。我已经想出了如何从 UIDatePicker 获取时间,但我不知道如何正确设置 nstimer 的触发功能。这是我到目前为止所尝试的,如果有人可以提供帮助......不胜感激。谢谢

示例(它每秒都会进入函数,而不是我告诉它的某个时间......不是我想要的):

NSDate *timestamp;
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];

[comps setHour:2];
[comps setMinute:8];
timestamp = [[NSCalendar currentCalendar] dateFromComponents:comps];

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:YES];

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:f forMode: NSDefaultRunLoopMode]; 

【问题讨论】:

@Nate 但是如果用户选择他们想要重复警报怎么办?而且我认为这没有意义,因为它每秒都在重复,而不是在我设定的时间(2:08)重复? 对于一个闹钟应用程序,您一开始无法知道用户是否会重复(打盹)。因此,当您第一次创建计时器时,您无法做出该决定。当闹钟响起 (test) 时,您需要决定是否创建一个新计时器,并设置贪睡时间interval @Nate 好的,谢谢你,但这并没有解决它每秒发射并重复的事实......为什么它不在 2:08 而不是每一秒都这样做? 其实,你做了一件很奇怪的事。你已经设置了repeats = YES,但是interval = 0。这并没有多大意义。因此,也许计时器默认为某个非零时间,以避免在没有时间的情况下大量调用 test 来烧毁 CPU。 我想如果 snooze 按钮只允许你打盹一段特定的时间(例如,10 分钟),你可以像你一样设置计时器, 开火日期等于它应该熄灭的时间。间隔将是 10 分钟。重复可能是YES。然后,如果用户决定打盹,您可以简单地取消计时器。这可以工作。 【参考方案1】:

正如@Nate 所说的改变

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:YES];

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:NO]; //<-- Change here

【讨论】:

感谢 Jennis,但如果用户选择他们想要重复警报怎么办?而且我认为这没有意义,因为它每秒都在重复,而不是在我设定的时间(2:08)重复? 那么你想要的是,如果你设置了 2:08 应该重复几天的闹钟? 是的。我现在说的2:08只是一个例子,实际时间将由用户决定。谢谢 在这种情况下,您需要查看 UILocalNotification 教程,因为当您的应用程序进入后台或关闭时,NSTimer 将无法按要求工作。 真的吗?如果它暂停在后台 nstimer 将不起作用?对于关闭的应用程序,由于苹果的限制,我已警告我的用户不要这样做

以上是关于使用 NSTimer 制作闹钟的主要内容,如果未能解决你的问题,请参考以下文章

我们如何让 NSTimer 在 iOS 中为我​​的音频播放器在后台运行

如何停止 NSTimer

NSTimer 中的错误(Swift:Xcode)

NSTimer 几秒钟后停止

如何让我的应用在后台运行 NSTimer?

音频流、NSTimer 和解析 JSON 场景