コードが NativeCal の例に基づいている場合、バグがあります。
- (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate
[events removeAllObjects]
は関数の先頭で呼び出され、ブロックの後半で再設定されるためdispatch_async
、最初の呼び出しが完了する前に関数が再度呼び出されると、イベント リストに重複したイベントが含まれる可能性があります。dispatch_async
メインスレッドへのコールバックでブロックへの呼び出しを変更dispatch_sync
し、その呼び出しのイベントリストをクリアして、次のコードを生成することでこれを修正しました。
dispatch_async(eventStoreQueue, ^{
NSDate *fetchProfilerStart = [NSDate date];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:fromDate endDate:toDate calendars:nil];
NSArray *matchedEvents = [eventStore eventsMatchingPredicate:predicate];
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Fetched %d events in %f seconds", [matchedEvents count], -1.f * [fetchProfilerStart timeIntervalSinceNow]);
[events removeAllObjects];
[events addObjectsFromArray:matchedEvents];
[delegate loadedDataSource:self];
});
});