這是通知的發送方式和每個實際通知的結果。根據我的經驗,您可以期望至少收到一個通知,要求更改某個項目(事件,提醒等),並至少再收到一個通知,以更改該項目的包含日曆。
沒有看到你的代碼,並知道正在做什麼改變,我不能太具體的答案;但是,一般來說,你有兩種選擇。
- 更緊密地觀察其變化 - 也許你可以放心地忽略一些通知,如果他們擔心,不屬於你的應用程序事件,或者如果你已經處理特定項目的變化。
- 將多個更改合併爲一批處理程序代碼。基本上,當你收到通知時,不要立即開始響應,而是啓動一個定時器,以便在一兩秒內運行響應。然後,如果另一個通知在定時器啓動之前進入,您可以取消定時器並重置它。這樣,您可以批量處理在短時間窗口內發出的多個通知,並且只會響應一次(定時器最終觸發時)。
後者的解決方案是我的首選答案,可能看起來像(暫時忽略線程問題):
@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");
}
來源
2012-08-30 21:22:20
Tim
只是一個快速謝謝你,和反饋:與iOS 8.4.1的行爲你注意到(每次更改至少發出2次通知)仍然非常真實,您的n。 2解決方案對我來說非常有用;我不確定解決方案1可以應用於EKEventStoreChangedNotification,但是,因爲這些通知沒有描述EKEventStore發生了什麼變化。所以,解決方案n。 2是要走的路! – cdf1982
我在iOS9上遇到同樣的問題 –