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

Ios 在完成块中调用UIAlertView需要很长时间才能显示,ios,uialertview,ekeventstore,Ios,Uialertview,Ekeventstore,我的应用程序的一部分需要日历访问,这需要从iOS 7开始调用EKEventStore方法-(void)requestAccessToEntityType:(EKEntityType)entityType完成:(EKEventStoreRequestAccessCompletionHandler)完成 我添加了请求,如果用户选择允许访问,一切都会顺利运行,但是如果用户拒绝或以前拒绝访问,就会出现问题。我添加了一个UIAlertView来通知用户访问是否被拒绝,但是UIAlertView始终需要20

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

我添加了请求,如果用户选择允许访问,一切都会顺利运行,但是如果用户拒绝或以前拒绝访问,就会出现问题。我添加了一个
UIAlertView
来通知用户访问是否被拒绝,但是
UIAlertView
始终需要20-30秒才能显示,并在这段时间内完全禁用UI。调试表明,
[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\u async(dispatch\u get\u main\u 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];
                                   }
                               });
                           }];

文档中明确指出:“当用户点击以授予或拒绝访问权限时,将在任意队列上调用完成处理程序。”这意味着“这可能是一个后台线程!”信息量极大;谢谢你发布这个。问和回答你自己的问题是完全正确的。你甚至可以在几天后接受你自己的答案,当然你不会因此而获得声誉积分。谢谢马特。这实际上是我自己回答的第二个问题。我想,如果我有一个问题,我找不到任何具体的帮助,我发现了一个解决方案,我应该分享给任何人谁发现自己在未来的同一个问题。另外,如果我再次遇到同样的问题,它使解决方案更容易在以后参考。