EKEventStoreChangedNotification wird mehrmals aufgerufen

8

Ich verwende den EKEventStore in meiner App. Ich nehme den Standardspeicher und registriere mich für EKEventStoreChangedNotification , um benachrichtigt zu werden, wenn Änderungen am Kalender vorgenommen werden. Wenn jedoch eine Änderung vorgenommen wird, wird der Absender für die Benachrichtigung mehrere (5-10) mal aufgerufen, manchmal mit bis zu 15 Sekunden zwischen jedem Aufruf. Dies verwirrt meinen Code und macht die Arbeit mit diesen wesentlich schwieriger. Kann ich irgendetwas dagegen tun?

Danke

iOS7 EDIT: Es scheint so, als ob ab iOS7 dieses Problem verschwunden ist. Jetzt wird unabhängig von der Änderung im CalendarStore nur ein EKEventStoreChangedNotification gesendet.

    
Kyle Rosenbluth 30.08.2012, 21:04
quelle

1 Antwort

16

Dies ist ein Ergebnis genau der Art und Weise, in der die Benachrichtigungen gesendet werden und worüber sie tatsächlich berichten. Meiner Erfahrung nach können Sie erwarten, dass mindestens eine Benachrichtigung für eine Änderung an einem Element (Ereignis, Erinnerung usw.) und mindestens eine weitere für die resultierende Änderung an dem enthaltenen Kalender für dieses Element erhalten wird.

Ohne Ihren Code zu sehen und zu wissen, welche Änderungen vorgenommen werden, kann ich nicht besonders auf eine Antwort eingehen; Im Allgemeinen haben Sie jedoch zwei Möglichkeiten.

  1. Beobachten Sie die Änderungen genauer. Vielleicht können Sie einige Benachrichtigungen ignorieren, wenn sie Ereignisse betreffen, die nicht zu Ihrer App gehören oder wenn Sie bereits eine Änderung für ein bestimmtes Element vorgenommen haben.
  2. Verschmelzen Sie mehrere Änderungen zu einem einzigen Batch des Handler-Codes. Im Grunde, wenn Sie die Benachrichtigung erhalten, starten Sie einen Timer, der die Antwort in einer oder zwei Sekunden ausführt, anstatt Ihre Antwort sofort zu starten. Wenn dann eine andere Benachrichtigung eingeht, bevor der Timer ausgelöst wird, können Sie den Timer abbrechen und zurücksetzen. Auf diese Weise können Sie mehrere Benachrichtigungen in einem kurzen Zeitfenster bündeln und nur einmal darauf reagieren (wenn der Timer schließlich ausgelöst wird).

Die letztere Lösung ist meine bevorzugte Antwort und könnte etwa so aussehen (Threading-Bedenken vorübergehend ignorieren):

%Vor%     
Tim 30.08.2012, 21:22
quelle