我正在尝试使用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
被触发了吗?
答案 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及更高版本。