如果您的代码基于 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];
});
});