Ios 在完成块中调用UIAlertView需要很长时间才能显示
我的应用程序的一部分需要日历访问,这需要从iOS 7开始调用Ios 在完成块中调用UIAlertView需要很长时间才能显示,ios,uialertview,ekeventstore,Ios,Uialertview,Ekeventstore,我的应用程序的一部分需要日历访问,这需要从iOS 7开始调用EKEventStore方法-(void)requestAccessToEntityType:(EKEntityType)entityType完成:(EKEventStoreRequestAccessCompletionHandler)完成 我添加了请求,如果用户选择允许访问,一切都会顺利运行,但是如果用户拒绝或以前拒绝访问,就会出现问题。我添加了一个UIAlertView来通知用户访问是否被拒绝,但是UIAlertView始终需要20
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];
}
});
}];
文档中明确指出:“当用户点击以授予或拒绝访问权限时,将在任意队列上调用完成处理程序。”这意味着“这可能是一个后台线程!”信息量极大;谢谢你发布这个。问和回答你自己的问题是完全正确的。你甚至可以在几天后接受你自己的答案,当然你不会因此而获得声誉积分。谢谢马特。这实际上是我自己回答的第二个问题。我想,如果我有一个问题,我找不到任何具体的帮助,我发现了一个解决方案,我应该分享给任何人谁发现自己在未来的同一个问题。另外,如果我再次遇到同样的问题,它使解决方案更容易在以后参考。