EKEventStoreChangedNotification

EKEventStoreChangedNotification

我在我的应用程序中使用EKEventStore。我获取默认存储,并注册EKEventStoreChangedNotification,以便在更改日历时得到通知。但是,进行更改后,通知的发送方将被调用几次(5-10)次,有时每次调用之间的间隔可能长达15秒。这弄乱了我的代码,使工作变得更加困难。有什么我可以做的吗?

谢谢

iOS7编辑:似乎从iOS7版本开始,此问题就消失了。现在,无论对CalendarStore进行的更改如何,都只会发送一个EKEventStoreChangedNotification

最佳答案

这是由于通知的发送方式以及每个通知实际通知的内容的结果。以我的经验,您可以期望至少收到一个关于项目更改的通知(事件,提醒等),并且至少收到一个有关该项目包含日历的更改的通知。

在没有看到您的代码并知道正在进行哪些更改的情况下,我对答案不能太具体;但是,通常,您有两种选择。

  • 更仔细地观察更改-如果它们涉及与应用程序无关的事件,或者您已经处理了特定项目的更改,则可以放心地忽略某些通知。
  • 将多个更改合并为一批处理程序代码。基本上,当您收到通知时,不要立即启动响应,而要启动一个计时器,该计时器将在一两秒钟内运行响应。然后,如果在计时器启动之前又有其他通知出现,则您可以取消计时器并将其重置。这样,您可以分批在较短的时间范围内出现的多个通知,并且只响应一次(当计时器最终触发时)。

  • 后一种解决方案是我的首选答案,可能看起来像(暂时忽略线程问题):
    @property (strong) NSTimer *handlerTimer;
    
    - (void)handleNotification:(NSNotification *)note {
        // This is the function that gets called on EKEventStoreChangedNotifications
        [self.handlerTimer invalidate];
        self.handlerTimer = [NSTimer timerWithTimeInterval:2.0
                                                    target:self
                                                  selector:@selector(respond)
                                                  userInfo:nil
                                                   repeats:NO];
        [[NSRunLoop mainRunLoop] addTimer:self.handlerTimer
                                  forMode:NSDefaultRunLoopMode];
    }
    
    - (void)respond {
        [self.handlerTimer invalidate];
        NSLog(@"Here's where you actually respond to the event changes");
    }
    

    关于iphone - EKEventStoreChangedNotification被多次调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12205484/

    10-09 07:33