2

在 iPhone SDK 3.0 中,我想注册一个通知,它会在达到特定时间时提醒我的应用程序。是否可以?谢谢

4

5 回答 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...
 }

如果它都在一个类中,您可以合并此代码。或指定targetinNSTimer以指向要在其中运行的类实例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 中实施的“本地通知”:

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008194-CH1-SW1

这应该是 >=4.0 的正确答案。对于早期版本,可能仍然只有 NSNotifications(对大多数人来说,实现推送太麻烦了)

于 2010-09-02T09:52:55.177 回答