在 iPhone SDK 3.0 中,我想注册一个通知,它会在达到特定时间时提醒我的应用程序。是否可以?谢谢
问问题
2872 次
5 回答
5
设置一个NSTimer
每 30 秒运行一次选择器(或您需要的任何粒度):
[NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
选择-timerFired:
器(方法)将每 30 秒运行一次,并检查小时、分钟和秒组件,如果元素与所需时间匹配,则触发通知:
- (void) timerFired:(NSNotification *)notification {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];
NSInteger hour = [dateComponents hour];
NSInteger min = [dateComponents minute];
NSInteger sec = [dateComponents second];
if ((hour == kDesiredHour) && (min == kDesiredMinute) && (sec == kDesiredSecond)) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kTimeComponentsWereMatched" object:nil userInfo:nil];
}
}
您注册以在某个其他类的某个地方收听此通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"kTimeComponentsWereMatched" object:nil];
因此,您在同一个类中有一个方法可以做一些有趣的事情:
- (void) doSomething:(NSNotification *)notification {
// do something interesting here...
}
如果它都在一个类中,您可以合并此代码。或指定target
inNSTimer
以指向要在其中运行的类实例selector
。
于 2009-09-21T04:05:00.927 回答
1
我假设您希望此计时器触发,即使应用程序已关闭。您可以为此使用通知,但您必须有一个发布通知的服务器。
此外,iPhone 会发出警报,要求用户打开应用程序——但他们可以选择不这样做。
于 2009-09-21T04:55:48.080 回答
1
假设您NSDate
在变量中有 a date
,并且想dateIsHere:
在该日期触发该方法,请执行以下操作:
NSTimer* timer = [[NSTimer alloc] initWithFireDate:date
interval:0.0f
target:self
selector:@selector(dateIsHere:)
userInfo:nil
repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer
forMode:NSDefaultRunLoopMode];
[timer release];
于 2009-09-21T05:17:03.663 回答
0
您将首先设置一个 NSTimer 在某个日期触发,触发的选择器可以是您想要的任何东西。无需使用 NSNotifications。
于 2009-09-21T03:59:31.970 回答
0
您正在寻找自 4.0 版开始在 iOS 中实施的“本地通知”:
这应该是 >=4.0 的正确答案。对于早期版本,可能仍然只有 NSNotifications(对大多数人来说,实现推送太麻烦了)
于 2010-09-02T09:52:55.177 回答