2012-08-30 69 views
8

我在我的應用程序中使用EKEventStore。我抓取默認商店並註冊EKEventStoreChangedNotification以在日曆發生更改時收到通知。但是,當發生更改時,通知的發件人會被調用幾次(5-10次),有時每次調用之間最多會有15秒。這弄亂了我的代碼,使事情變得更加困難。我能做些什麼嗎?EKEventStoreChangedNotification被多次調用

感謝

iOS7編輯:好像作爲iOS7的發佈,這個問題已經消失。現在,無論對CalendarStore所做的更改如何,只發送一個EKEventStoreChangedNotification

回答

16

這是通知的發送方式和每個實際通知的結果。根據我的經驗,您可以期望至少收到一個通知,要求更改某個項目(事件,提醒等),並至少再收到一個通知,以更改該項目的包含日曆。

沒有看到你的代碼,並知道正在做什麼改變,我不能太具體的答案;但是,一般來說,你有兩種選擇。

  1. 更緊密地觀察其變化 - 也許你可以放心地忽略一些通知,如果他們擔心,不屬於你的應用程序事件,或者如果你已經處理特定項目的變化。
  2. 將多個更改合併爲一批處理程序代碼。基本上,當你收到通知時,不要立即開始響應,而是啓動一個定時器,以便在一兩秒內運行響應。然後,如果另一個通知在定時器啓動之前進入,您可以取消定時器並重置它。這樣,您可以批量處理在短時間窗口內發出的多個通知,並且只會響應一次(定時器最終觸發時)。

後者的解決方案是我的首選答案,可能看起來像(暫時忽略線程問題):

@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"); 
} 
+1

只是一個快速謝謝你,和反饋:與iOS 8.4.1的行爲你注意到(每次更改至少發出2次通知)仍然非常真實,您的n。 2解決方案對我來說非常有用;我不確定解決方案1可以應用於EKEventStoreChangedNotification,但是,因爲這些通知沒有描述EKEventStore發生了什麼變化。所以,解決方案n。 2是要走的路! – cdf1982

+0

我在iOS9上遇到同樣的問題 –