以编程方式链接的UIView基于块的动画在第一次在iOS上触发时挂起

时间:2013-09-23 09:44:08

标签: 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...
                     }];
}

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

1 个答案:

答案 0 :(得分:3)

首先,所有UI代码都应该在主线程上执行。如果您不遵守此规则,您将获得意想不到的结果。当我想要运行一些UI代码时,我没有经历任何事情,并且每当我错误地在后台线程上运行UI代码时,应用程序都会挂起。关于为什么UI代码必须在主线程上运行,有很多讨论。

如果您知道您已收到响应方法将在主线程以外的线程上执行,您可以使用Grand Central Dispatch(GCD)轻松将其恢复到主线程。使用GCD比使用performSelectorOnMainThread方法更好......

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