我有一个事件,我需要安排在每小时的顶部(早上6点,早上7点,早上8点等)。我正在考虑用延迟连接执行选择器,但这看起来很漂亮。调度计时器似乎是合乎逻辑的步骤,但计时器的诀窍在于它必须是每小时的TOP。
例如,如果我在3:48开始,我希望事件在4:00执行,然后再在5:00执行,依此类推,而不是4:48和5:48。
有什么建议吗?
答案 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”方法之一中设置计时器。