2012-04-03 16 views
13

Ich möchte alle Ereignisse aus einem bestimmten Kalender in meiner App abrufen. Ich habe den Kalender und die Testereignisse in meiner App erstellt (benötigt iOS 5.0 oder später zum Erstellen von benutzerdefinierten Kalendern). Wenn ich die App auf meinem Gerät starte und dann die Systemkalender-App überprüfe, werden mein Kalender und meine erstellten Ereignisse korrekt angezeigt.EKEventStore Ereignisse abrufen gibt leere Liste zurück

Jetzt möchte ich meine App alle diese Ereignisse aus diesem benutzerdefinierten Kalender lesen. Meine Ereignisse werden mit startDate und endDate auf NOW (NSDate allowed ohne timeInterval gegeben) erstellt.

Wie Sie sehen können, gebe ich ein Zeitintervall an, in dem die resultierenden Ereignisse sein müssen. Wie Sie sehen können, liegt das Enddatum in 25 Jahren, während das Startdatum in der Vergangenheit 4 Jahre (plus ein Tag für das Schaltjahr) beträgt. Wenn ich den EKEventstore auf diese Weise abfrage, erhalte ich die zuvor hinzugefügten Ereignisse. Der heikle Teil beginnt, wenn ich das Startdatum um einen (oder mehrere Tage oder Jahre) zurück in die Vergangenheit legen möchte. Dann werden plötzlich keine Ereignisse mehr zurückgegeben.

NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 2)]; 

Gibt es ein Limit für negative Werte eines NSTimeInterval in einem NSPredicate? Ich habe keine dokumentierten Einschränkungen gefunden. Ich brauchte ungefähr 2 Stunden, um zu erkennen, warum ich keine Ereignisse bekam (ursprünglich wollte ich eine Zeitspanne von 5 Jahren in der Vergangenheit und 5 Jahren in der Zukunft). Was ist der Grund für dieses seltsame Verhalten? Irgendeine Idee?

/bearbeiten am 04/11/2012 Nach dem Erstellen einiger Ereignisse mit einem Startdatum am 31.03.2012 und 20.04.2012 scheint es so zu sein, dass das Abrufen von Ereignissen nach Daten, die in Intervallen festgelegt sind, begrenzt ist eine Intervalllänge von 4 Jahren. Indem ich mein Startdatum (indem ich den Starttag um einen Tag früher gesetzt habe) in dem oben angegebenen Code änderte, konnte ich Events bis zum 31.03.2012 erhalten, aber nicht später. Das Entfernen dieser Anpassung führte dazu, dass Ereignisse vom 31.03.2012 und 04.01.2012 (aber nicht vom 20.04.2012) erhalten wurden. Nach einer zweiten Anpassung (Einstellung des Startdatums 20 Tage später) bekam ich sogar diese zukünftigen Ereignisse.
Ich kann nicht angeben, warum es solche Einschränkungen gibt. Möglicherweise gibt es einige interne Berechnungen, die zu Überläufen des verwendeten Wertspeichers führen würden. Nur eine Vermutung.

Dann gehe ich zu Apple Beispiele. Auf den ersten Blick wollte ich den angegebenen Code nicht im EKEvent Programming Guide von Apple verwenden. Es sah nicht so klein aus wie meine, aber nachdem ich so viel Ärger hatte, gab ich einen Versuch.

CFGregorianDate gregorianStartDate, gregorianEndDate; 
CFTimeZoneRef timeZone = CFTimeZoneCopySystem(); 

gregorianStartDate.hour = 0; 
gregorianStartDate.minute = 0; 
gregorianStartDate.second = 0; 
gregorianStartDate.day = 1; 
gregorianStartDate.month = 4; 
gregorianStartDate.year = 2008; 

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; 
gregorianEndDate.hour = 23; 
gregorianEndDate.minute = 59; 
gregorianEndDate.second = 59; 
gregorianEndDate.day = [components day]; 
gregorianEndDate.month = [components month]; 
gregorianEndDate.year = [components year] + 1; 

NSDate *startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)]; 
NSDate *endDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianEndDate, timeZone)]; 
CFRelease(timeZone); 

So bekomme ich alle Termine ab 01.04.2008 bis JETZT() + 1 Jahr. Nun, es stellte sich heraus, dass die gleiche Einschränkung hier verwendet wird: (Das Anpassen des Startdatums führte dazu, dass nur ein Teil meiner Ereignisse abgerufen wurde, bis die letzten Ereignisse im Bereich dieser 4 Jahre lagen.

Intensive Untersuchungen zeigten, dass dies der Fall war Verhalten existiert eine sehr lange Zeit: Fetch all events from EventStore EventKit iOS

+1

hilft Können Sie Ereignisse sammeln, indem nacheinander dieses 4 Jahre Fenster bewegen und die Ergebnisse aggregiert? – CuriousRabbit

+0

Nun, das sieht nach einer komplizierten Arbeit aus, aber ja, das sollte wahrscheinlich funktionieren. – TRD

+0

Ja, sieht wie eine echte PITA aus, versucht aber nur, einen Workaround für dein Problem vorzuschlagen. – CuriousRabbit

Antwort

0

Es ist in der Regel eine schlechte Sache, für einen so großen Datumsbereich von Ereignissen aus CalendarStore abzufragen.Die Leistung ist schrecklich ziehen Monat für Monat, und Sie wollen "alle" ziehen "Definitiv nicht empfohlen. Lassen Sie CalendarStore die sein, die sich um" alles "kümmern muss, und Sie sollten sich darauf konzentrieren, wie Sie die zu ziehenden Zeiträume richtig eingrenzen.

F Oder, wenn Sie eine normale Kalender-App haben, die jeweils einen Monat anzeigt, ziehen Sie einfach 3 Monate herunter (Ihren Zielmonat plus den Monat vor und hinter Ihrem aktuellen Kalender). Wenn jemand in den nächsten Monat blättert, dann schreibe eine Anfrage, um den nächsten Monat zu bekommen, und so weiter.

Vielleicht könnten Sie weitere Informationen darüber geben, was Ihren Wunsch nach "allen" Ereignissen antreibt?

1

Ich stimme zu, dass James zu viele Ereignisse mit einem Datum zieht, das in der Zukunft so weit entfernt ist, dass man glücklicherweise remoteFuture verwenden kann, um weit entfernte Ereignisse einzuziehen.

Dies zieht natürlich nicht alle Ereignisse, sondern so viele Ereignisse wie möglich hervor, ohne Speicher oder andere Probleme zu verursachen.

NSDate *endDate = [NSDate distantFuture]; 

Hoffnung, die

Verwandte Themen