ios - 以编程方式链接的基于 UIView block 的动画在 iOS 上首次触发时挂起

标签 ios objective-c animation

在我的项目中,程序在查询数据库时触发一个动画,当它收到响应数据时,它会自动触发另一个动画来显示数据。

-(void)queryDatabase{
    //...querying database ...
    [UIView animateWithDuration:0.4
                          delay:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{ 
                       //...first animation block...
                     }
                     completion:^(BOOL finished){
                       //...first completion block...
                     }];
}

-(void)receivedResponse:(NSData *)responseData{
    [UIView animateWithDuration:0.4
                          delay:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{ 
                       //...second animation block...
                     }
                     completion:^(BOOL finished){
                       //...second completion block...
                     }];
}

我的问题是,当程序启动并在第一次收到响应时触发第二个动画时,“第二个动画 block ”被准确执行,但“第二个完成 block ”没有执行并且屏幕没有改变直到大约 20 秒或更长时间过去。之后,当再次调用此循环时,第二个动画将始终正常工作。如何修复?

最佳答案

首先,所有 UI 代码都应该在主线程上执行。如果你不遵守这一点,你会得到意想不到的结果。当我想要运行一些 UI 代码时,我没有遇到任何事情发生,而每当我错误地在后台线程上运行 UI 代码时,应用程序就会挂起。关于为什么 UI 代码必须在主线程上运行的讨论很多。

如果您知道您的 receivedResponse 方法将在主线程以外的线程上执行,您可以使用 Grand Central Dispatch (GCD) 轻松地将它带回主线程。 GCD 比 performSelectorOnMainThread 方法好用得多...

-(void)receivedResponse:(NSData *)responseData{
    dispatch_async(dispatch_get_main_queue(), ^{
        // put your UI code in here
    });
}

关于ios - 以编程方式链接的基于 UIView block 的动画在 iOS 上首次触发时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18956158/

相关文章:

ios - ECSlidingViewController 中的 Top View Controller 是否有办法知道侧边栏菜单何时被关闭?

objective-c - 如何在 xcode 4.5 中创建倒数计时器

jQuery,滑入文本

iOS animationWithDuration 链接第一个动画未显示

javascript - 为什么不能使用 JavaScript 改变 CSS 动画的速度

ios - 动画约束时防止 subview 上不需要的动画

ios - 限制 iphone 应用仅安装在配备 Retina 显示屏的设备上 (iphone 4/4S)

ios - Swift - 在 UIImageView/UIScrollView 之上的 UIView

ios - 如何通过 xcode 中的 nib 将 UIViewController 放置在另一个 UIViewController 中

objective-c - UITextView 未正确调整大小