1

我有一个活动需要安排在每小时(早上 6 点、早上 7 点、早上 8 点等)的顶部。我正在考虑将性能选择器与延迟链接在一起,但这看起来很笨拙。安排计时器似乎是合乎逻辑的步骤,但计时器的诀窍在于它必须是每小时的 TOP。

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

有什么建议么?

4

2 回答 2

3

以这种方式调度选择器并不好。您可以改为安排本地通知。这将使您能够安排事件,即使您的应用程序是后台的。

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];
于 2013-07-05T18:45:08.323 回答
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

但是,您的应用程序可能在后台。目前尚不清楚在这种情况下您会期望什么,但我假设您希望在应用程序处于前台时发生这种每小时的事情。在这种情况下,请在应用程序委托的“启动”方法之一中设置计时器。

于 2013-07-05T17:31:57.370 回答