为特定日期/时间安排选择器

时间:2013-07-05 17:07:10

标签: ios objective-c

我有一个事件,我需要安排在每小时的顶部(早上6点,早上7点,早上8点等)。我正在考虑用延迟连接执行选择器,但这看起来很漂亮。调度计时器似乎是合乎逻辑的步骤,但计时器的诀窍在于它必须是每小时的TOP。

例如,如果我在3:48开始,我希望事件在4:00执行,然后再在5:00执行,依此类推,而不是4:48和5:48。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

以这种方式调度选择器并不好。您可以改为安排local notification。即使应用程序处于后台,这也可以让您安排事件。

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate dateWithTimeIntervalSince1970:1373050800];
notification.userInfo = @{@"key" : @"some contextual info on what to do"};
notification.alertBody = @"Hello, it's 2pm!";
notification.alertAction = @"Details";

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

答案 1 :(得分:2)

第一个技巧是获得你想要的日期。以下是您可能需要的示例:

-(NSDate*)dateAtHour:(NSInteger)hour {

    NSDate *localDate = [self toLocal];
    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                           components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit 
                           fromDate:localDate];
    comps.hour = hour;
    comps.minute = 0;
    comps.second = 0;

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDate *date = [gregorian dateFromComponents:comps];

    return [date toUTC];
}

-(NSDate *) toLocal {
    NSTimeZone *tz = [NSTimeZone localTimeZone];
    NSInteger seconds = [tz secondsFromGMTForDate: self];
    return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

-(NSDate *) toUTC {
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"UTC"];
    NSInteger seconds = [tz secondsFromGMTForDate: self];
    return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

然后您只需要为特定日期/时间安排NSTimer:

- (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

但是,您的应用可能在后台。目前还不清楚你在这种情况下的期望,但我假设你希望这个每小时的事情发生在应用程序处于前台时。在这种情况下,请在app delegate的“launch”方法之一中设置计时器。