NSTimeInterval并不总是触发

时间:2015-11-10 21:57:08

标签: ios objective-c uidatepicker nstimeinterval

我正在制作一个简单的收音机闹钟应用程序,用于非主流,我想要醒来。它使用选择退出背景技巧以在手机锁定时保持运行,类似于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)];

1 个答案:

答案 0 :(得分:2)

你可以使用

[NSTimer scheduledTimerWithTimeInterval:differenceFromNow
    target:self
    selector:@selector(PlayAlarm:)
    userInfo:nil
    repeats:NO];

这个计时器非常准确。 如果您需要中止计时器,只需将返回的NSTimer *保存在属性中并调用

[myTimer invalidate];