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];