NSTimeInterval 并不总是触发
NSTimeInterval not always firing
我正在为非主流流开发一个简单的无线电闹钟应用程序,我想在其中醒来。当 phone 被锁定时,它使用退出背景技巧来保留 运行,类似于 Rise/Sleepcycle.
最初如果我在午夜之前设置闹钟,第二天闹钟不会触发,但如果设置在当前时间之前但在 00:00 之前,闹钟几乎总是会在每分钟触发
所以我做了一些调整,以便也检查日期。我还包括条件,因此不可能在当前时间之前设置时间。现在虽然这解决了第二天的问题,但我发现火本身是喜怒无常的。有时它工作得很好,有时会有很大的延迟(在某些情况下长达 10 分钟)有时它根本不会触发。我真的想不通为什么会这样。
下面是我的代码。有没有人知道为什么它不一致?
- (void)viewDidLoad {
[super viewDidLoad];
radio = [[Radio alloc] initWithUserAgent:@"my app"];
[radio connect:STREAM_URL withDelegate:self withGain:(1.0)];
// dateTimePicker.date = [NSDate date];
dateTimePicker.date =
[[ NSDate alloc ] initWithTimeIntervalSinceNow: (NSTimeInterval) 2];
dateTimePicker.minimumDate =
[[ NSDate alloc ] initWithTimeIntervalSinceNow: (NSTimeInterval) 0 ];
}
-(void) presentMessage:(NSString *)message {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Radio Alarm" message: message delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}
- (IBAction)alarmSetButtonTapped:(id)sender {
NSLog( @"Alarm Set Button Tapped");
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
dateFormatter.timeStyle = NSDateFormatterShortStyle;
dateFormatter.dateStyle = NSDateFormatterShortStyle;
NSString * dateTimeString = [dateFormatter stringFromDate: dateTimePicker.date];
NSLog( @"Alarm Set Button Tapped : %@", dateTimeString);
[self presentMessage:[NSString stringWithFormat:@"Alarm set for %@", dateTimeString]];
NSDate *alarmFireDate = dateTimePicker.date;
NSTimeInterval differenceFromNow = [alarmFireDate timeIntervalSinceNow];
//[alarmFireDate performSelector:@selector(PlayAlarm:) withObject:nil afterDelay:differenceFromNow];
[self performSelector:@selector(PlayAlarm:)
withObject:(self)
afterDelay:(differenceFromNow)];
你可以使用
[NSTimer scheduledTimerWithTimeInterval:differenceFromNow
target:self
selector:@selector(PlayAlarm:)
userInfo:nil
repeats:NO];
这个计时器非常准确。
如果您需要中止计时器,只需将返回的 NSTimer* 保存在 属性 中并调用
[myTimer invalidate];
我正在为非主流流开发一个简单的无线电闹钟应用程序,我想在其中醒来。当 phone 被锁定时,它使用退出背景技巧来保留 运行,类似于 Rise/Sleepcycle.
最初如果我在午夜之前设置闹钟,第二天闹钟不会触发,但如果设置在当前时间之前但在 00:00 之前,闹钟几乎总是会在每分钟触发
所以我做了一些调整,以便也检查日期。我还包括条件,因此不可能在当前时间之前设置时间。现在虽然这解决了第二天的问题,但我发现火本身是喜怒无常的。有时它工作得很好,有时会有很大的延迟(在某些情况下长达 10 分钟)有时它根本不会触发。我真的想不通为什么会这样。
下面是我的代码。有没有人知道为什么它不一致?
- (void)viewDidLoad {
[super viewDidLoad];
radio = [[Radio alloc] initWithUserAgent:@"my app"];
[radio connect:STREAM_URL withDelegate:self withGain:(1.0)];
// dateTimePicker.date = [NSDate date];
dateTimePicker.date =
[[ NSDate alloc ] initWithTimeIntervalSinceNow: (NSTimeInterval) 2];
dateTimePicker.minimumDate =
[[ NSDate alloc ] initWithTimeIntervalSinceNow: (NSTimeInterval) 0 ];
}
-(void) presentMessage:(NSString *)message {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Radio Alarm" message: message delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}
- (IBAction)alarmSetButtonTapped:(id)sender {
NSLog( @"Alarm Set Button Tapped");
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
dateFormatter.timeStyle = NSDateFormatterShortStyle;
dateFormatter.dateStyle = NSDateFormatterShortStyle;
NSString * dateTimeString = [dateFormatter stringFromDate: dateTimePicker.date];
NSLog( @"Alarm Set Button Tapped : %@", dateTimeString);
[self presentMessage:[NSString stringWithFormat:@"Alarm set for %@", dateTimeString]];
NSDate *alarmFireDate = dateTimePicker.date;
NSTimeInterval differenceFromNow = [alarmFireDate timeIntervalSinceNow];
//[alarmFireDate performSelector:@selector(PlayAlarm:) withObject:nil afterDelay:differenceFromNow];
[self performSelector:@selector(PlayAlarm:)
withObject:(self)
afterDelay:(differenceFromNow)];
你可以使用
[NSTimer scheduledTimerWithTimeInterval:differenceFromNow
target:self
selector:@selector(PlayAlarm:)
userInfo:nil
repeats:NO];
这个计时器非常准确。 如果您需要中止计时器,只需将返回的 NSTimer* 保存在 属性 中并调用
[myTimer invalidate];