13

アプリの特定のカレンダーからすべてのイベントを取得したいと考えています。アプリでカレンダーとテスト イベントを作成しました (カスタム カレンダーを作成するには、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

4

2 に答える 2

0

通常、CalendarStore からこのような大きな日付範囲のイベントを照会するのは良くありません。一度に 1 か月ずつプルするパフォーマンスはひどいものですが、「すべて」プルしたいですか? 絶対にお勧めしません。「すべて」を心配する必要があるのは CalendarStore であり、プルする必要がある日付範囲を適切にスコープする方法に集中する必要があります。

たとえば、一度に 1 か月を表示する通常のカレンダー アプリがある場合は、3 か月 (対象の月と現在のカレンダーの前後の月を加えたもの) をプルダウンします。誰かが次の月にページを移動した場合は、その次の月を取得するように要求を出します。

「すべての」イベントを取得したいというあなたの欲求を駆り立てるものについて、より多くの情報を提供できますか?

于 2013-01-25T20:57:22.190 に答える