我有一个活动需要安排在每小时(早上 6 点、早上 7 点、早上 8 点等)的顶部。我正在考虑将性能选择器与延迟链接在一起,但这看起来很笨拙。安排计时器似乎是合乎逻辑的步骤,但计时器的诀窍在于它必须是每小时的 TOP。
例如,如果我在 3:48 开始,我希望事件在 4:00 执行,然后在 5:00 再次执行,依此类推,而不是 4:48 和 5:48。
有什么建议么?
我有一个活动需要安排在每小时(早上 6 点、早上 7 点、早上 8 点等)的顶部。我正在考虑将性能选择器与延迟链接在一起,但这看起来很笨拙。安排计时器似乎是合乎逻辑的步骤,但计时器的诀窍在于它必须是每小时的 TOP。
例如,如果我在 3:48 开始,我希望事件在 4:00 执行,然后在 5:00 再次执行,依此类推,而不是 4:48 和 5:48。
有什么建议么?
以这种方式调度选择器并不好。您可以改为安排本地通知。这将使您能够安排事件,即使您的应用程序是后台的。
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];
第一个技巧是得到你想要的日期。这是您可能需要的示例:
-(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
但是,您的应用程序可能在后台。目前尚不清楚在这种情况下您会期望什么,但我假设您希望在应用程序处于前台时发生这种每小时的事情。在这种情况下,请在应用程序委托的“启动”方法之一中设置计时器。