用fireDate初始化的NSTimer不会触发

时间:2011-10-24 21:58:22

标签: objective-c cocoa nstimer

我正在尝试使用NSTimer来调用方法,但它不起作用。 我需要在特定的日期和时间运行一次这个方法,用户在日历上设置。

我的viewDidLoad方法中包含此代码:

NSDateComponents *comps = [[NSDateComponents alloc] init];

[comps setDay:24];
[comps setMonth:10];
[comps setYear:2011];

[comps setHour:23];
[comps setMinute:11];
[comps setSecond:0];


NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:comps];
schedulerTimer=[[NSTimer alloc] initWithFireDate:date interval:0 target:self selector:@selector(recordByScheduler:) userInfo:nil repeats:false];

但是这段代码什么也没做。可能我误解了NSCalendar。我该怎么办?第二个问题:当应用程序在后台运行时,NSTimer被触发了吗?

3 个答案:

答案 0 :(得分:5)

您需要在runloop中安排计时器。

[[NSRunLoop currentRunLoop] addTimer:schedulerTimer forMode:NSDefaultRunLoopMode];

或类似,视情况而定。

对问题编辑的回复:

当您的应用程序在后台时,不会触发NSTimer。

答案 1 :(得分:2)

如果您的应用在后台暂停,则NSTimer不会触发。您可以根据需要使用UILocalNotification。

答案 2 :(得分:0)

我试过@NJones的答案,但它没有用。通过一点点杂耍,我发现你应该使用NSRunLoopCommonModes,而不是NSDefaultRunLoopMode mainRunLoop。例如,

[[NSRunLoop mainRunLoop] addTimer:schedulerTimer forMode:NSRunLoopCommonModes];

或Swift,我现在使用:

NSRunLoop.mainRunLoop().addTimer(schedulerTimer, forMode: NSRunLoopCommonModes)

但是,模式,而不是运行循环,阻止它在我的情况下工作。

该文件说明如下:

  

NSDefaultRunLoopMode

     

处理NSConnection对象以外的输入源的模式。

     

这是最常用的运行循环模式。

     

适用于iOS 2.0及更高版本。

     

NSRunLoopCommonModes

     

使用此值作为模式添加到运行循环的对象由所有已声明为“common"”的所有运行循环模式监视。模式;有关详细信息,请参阅CFRunLoopAddCommonMode的说明。

     

适用于iOS 2.0及更高版本。