gpt4 book ai didi

ios - UIView animateWithDuration 使应用程序在从 dispatch_async block 调用时挂起

转载 作者:行者123 更新时间:2023-11-28 18:59:26 26 4
gpt4 key购买 nike

首先,我有一个如下所示的协议(protocol):

@protocol CryptoDelegate <NSObject>
- (void)cryptoManagerFinishedEncryption;
@end

有一个名为 CryptoManager 的单例,它具有以下功能:

- (void)startEncryption:(NSURL *)path withDelegate:(id<CryptoDelegate>)delegate {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// ... some stuff is happening here
[delegate cryptoManagerFinishedEncryption];
});
}

然后我有一个自制的 MultiPopup 可以显示面板(它必须扩展 MultiPopupPanel 来存储 i.a. 指向弹出窗口本身的指针)并在这些面板之间切换使用以下代码:

- (void)switchTo:(MultiPopupPanel*)panel {
if(self.currentPanel != panel) {
MultiPopupPanel* oldPanel = self.currentPanel;
self.currentPanel = panel;
self.currentPanel.alpha = 0;
self.currentPanel.hidden = NO;

if(oldPanel) {
NSLog(@"Before animation");
[UIView animateWithDuration:0.2f animations:^{
oldPanel.alpha = 0;
} completion:^(BOOL finished) {
NSLog(@"After animation");
oldPanel.hidden = YES;
[UIView animateWithDuration:0.2f animations:^{
self.currentPanel.alpha = 1;
}];
}];
} else {
[UIView animateWithDuration:0.2f animations:^{
self.currentPanel.alpha = 1;
}];
}
}
}

现在我有一个扩展 MultiPopupPanel 并实现协议(protocol) CryptoDelegate 的面板。在其 cryptoManagerFinishedEncryption 实现中,我正在调用我的 switchTo 函数,该函数随后应切换到另一个面板。

这是应用程序挂起的地方:立即输出消息“Before animation”。然后应用挂起 15-20 秒,然后出现动画,输出“After animation”消息并显示新面板。

只有当我在另一个线程中(通过 dispatch_async)使用 +[UIView animateWithDuration...] 时才会发生这种情况。如果我在没有 dispatch_async(= 在主线程中)的情况下调用委托(delegate),一切都会顺利。

为什么会这样?是否允许从异步 block 调用动画?非常感谢任何帮助。

最佳答案

您必须始终在主线程上调用 UI 相关代码。不这样做是被禁止的,并且会导致意想不到的结果(通常是异常(exception))。

当调用您的委托(delegate)方法时,您应该再次将 dispatch_asyncdispatch_get_main_queue 一起使用,这样委托(delegate)代码将在主线程上运行,您可以更新您的 UI。

另见 these Apple docs了解更多具体信息。

关于ios - UIView animateWithDuration 使应用程序在从 dispatch_async block 调用时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766897/

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