在完成块中调用UIAlertView需要很长时间才能显示

我的应用程序的一部分需要日历访问,这需要调用EKEventStore方法-(void)requestAccessToEntityType:(EKEntityType)entityType completion:(EKEventStoreRequestAccessCompletionHandler)completion自iOS 7起-(void)requestAccessToEntityType:(EKEntityType)entityType completion:(EKEventStoreRequestAccessCompletionHandler)completion

我添加了请求,并且如果用户select允许访问,则一切运行顺利,但是如果用户拒绝访问或先前拒绝访问,则会出现问题。 我添加了一个UIAlertView来通知用户访问是否被拒绝,但是UIAlertView始终需要20-30秒才能出现,并在此期间完全禁用UI。 debugging显示[alertView show]在延迟之前运行,即使在延迟之后它不会真正显示。

为什么这个延迟发生,我怎么能删除它?

 [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { if (granted) { [self createCalendarEvent]; } else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Access Denied" message:@"Please enable access in Privacy Settings to use this feature." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } }]; 

[alertView show]不是线程安全的,因此它将UI更改添加到从其分派完成块的队列而不是主队列。 我解决了这个问题,通过添加dispatch_async(dispatch_get_main_queue(), ^{}); 围绕完成块内的代码:

 [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { [self createCalendarEvent]; } else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Access Denied" message:@"Please enable access in Privacy Settings to use this feature." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } }); }];