gpt4 book ai didi

ios - 在完成 block 中调用时,UIAlertView 需要很长时间才能出现

转载 作者:可可西里 更新时间:2023-11-01 06:20:07 28 4
gpt4 key购买 nike

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

我添加了请求,如果用户选择允许访问,一切都会顺利进行,但如果用户拒绝或之前拒绝访问,就会出现问题。我添加了一个 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 更改添加到调度完成 block 的队列而不是主队列。我通过在完成 block 内的代码周围添加 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];
}
});
}];

关于ios - 在完成 block 中调用时,UIAlertView 需要很长时间才能出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22333584/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com