アプリの特定のカレンダーからすべてのイベントを取得したいと考えています。アプリでカレンダーとテスト イベントを作成しました (カスタム カレンダーを作成するには、iOS 5.0以降が必要です)。デバイスでアプリを実行してシステム カレンダー アプリを確認すると、カレンダーと作成したイベントが正しく表示されます。
ここで、このカスタム カレンダーからすべてのイベントをアプリで読み取る必要があります。私のイベントは、startDate と endDate を NOW に設定して作成されます (NSDate は timeInterval を指定せずに割り当てられます)。
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 1)];
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 * 365 * 25];
NSArray *calendarList = [NSArray arrayWithObjects:tmpCal, nil];
NSPredicate *datePredicate = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:calendarList];
NSArray *eventList = [store eventsMatchingPredicate:datePredicate];
ご覧のとおり、結果のイベントが発生する時間間隔を指定しています。ご覧のとおり、終了日は今から 25 年後ですが、開始日は 4 年 (うるう年の場合は 1 日) 後です。この方法で EKEventstore を照会すると、以前に追加されたイベントが取得されます。開始日を 1 つ (または数日または数年) 過去に戻したい場合は、トリッキーな部分が始まります。その後、突然、イベントが返されなくなります。
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24 * (365 * 4 + 2)];
NSPredicate の NSTimeInterval の負の値に制限はありますか? 文書化された制限は見つかりませんでした。イベントが発生しない理由を検出するのに約 2 時間かかりました (当初は、過去 5 年間と将来 5 年間の範囲が必要でした)。この奇妙な行動の理由は何ですか?何か案が?
/edit on 04/11/2012 開始日が 2012 年 3 月 31 日と 2012 年 4 月 20 日のいくつかのイベントを作成した後、現在からの間隔で決定された日付によるイベントのフェッチは、4 の間隔の長さによって制限されているようです。年。上記のコードで (開始日を 1 日早く設定して) 開始日を調整すると、2012 年 3 月 31 日まではイベントを取得できましたが、それ以降のイベントは取得できませんでした。この調整を削除すると、2012 年 3 月 31 日と 2012 年 4 月 1 日からのイベントが取得されました (ただし、2012 年 4 月 20 日からのイベントは取得されません)。2回目の調整(開始日を20日後に設定)の後、それらの将来のイベントも取得しました.
そのような制限がある理由を特定することはできません。使用された値ストレージのオーバーフローにつながる内部計算がいくつかある可能性があります。推測です。
次に、Appleの例に進みます。一見したところ、Apple の EKEvent プログラミング ガイドに記載されているコードを使用したくありませんでした。私のように小さくてかわいくはありませんでしたが、苦労した後、試してみました。
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);
このようにして、2008 年 4 月 1 日から NOW() + 1 年までのすべてのイベントを取得します。さて、ここでも同じ制限が使用されていることが判明しました:(開始日を調整すると、最後のイベントがその4年間の範囲内になるまで、私のイベントの一部しか取得できませんでした.
集中的な調査により、この動作が非常に長い間存在することが判明しました: EventStore からすべてのイベントを取得する EventKit iOS