有没有办法找到NSDate
下一个要触发的本地通知?
例如,我设置了三个本地通知:
通知#1:设置为昨天下午3:00开始,每天重复一次。
通知#2:设置为今天下午5:00开始,每天重复一次。
通知#3:明天下午6点开始,每天重复一次。
鉴于当前是下午4:00,将触发的下一个本地通知是通知#2。
如何检索此本地通知并获取其日期?
我知道我可以在一个数组中检索这些本地通知,但是如何根据今天的日期获取下一个?#/ p>
答案 0 :(得分:11)
您的任务的主要目标是确定给定后的“下一个开火日期”
每个通知的日期。
NSLog()
的{{1}}输出显示了下一个开火日期,
但不幸的是,它似乎不是一个(公共)财产。
我从https://stackoverflow.com/a/18730449/1187415获取了代码(小编
改进)并将其重写为UILocalNotification
的类别方法。
(这不完美。它不包括时区的情况
分配给通知。)
UILocalNotification
使用它,您可以根据需要对本地通知数组进行排序 下一个开火日期:
@interface UILocalNotification (MyNextFireDate)
- (NSDate *)myNextFireDateAfterDate:(NSDate *)afterDate;
@end
@implementation UILocalNotification (MyNextFireDate)
- (NSDate *)myNextFireDateAfterDate:(NSDate *)afterDate
{
// Check if fire date is in the future:
if ([self.fireDate compare:afterDate] == NSOrderedDescending)
return self.fireDate;
// The notification can have its own calendar, but the default is the current calendar:
NSCalendar *cal = self.repeatCalendar;
if (cal == nil)
cal = [NSCalendar currentCalendar];
// Number of repeat intervals between fire date and the reference date:
NSDateComponents *difference = [cal components:self.repeatInterval
fromDate:self.fireDate
toDate:afterDate
options:0];
// Add this number of repeat intervals to the initial fire date:
NSDate *nextFireDate = [cal dateByAddingComponents:difference
toDate:self.fireDate
options:0];
// If necessary, add one more:
if ([nextFireDate compare:afterDate] == NSOrderedAscending) {
switch (self.repeatInterval) {
case NSDayCalendarUnit:
difference.day++;
break;
case NSHourCalendarUnit:
difference.hour++;
break;
// ... add cases for other repeat intervals ...
default:
break;
}
nextFireDate = [cal dateByAddingComponents:difference
toDate:self.fireDate
options:0];
}
return nextFireDate;
}
@end
现在NSArray *notifications = @[notif1, notif2, notif3];
NSDate *now = [NSDate date];
NSArray *sorted = [notifications sortedArrayUsingComparator:^NSComparisonResult(UILocalNotification *obj1, UILocalNotification *obj2) {
NSDate *next1 = [obj1 myNextFireDateAfterDate:now];
NSDate *next2 = [obj2 myNextFireDateAfterDate:now];
return [next1 compare:next2];
}];
将成为下一个触发的通知。