在我的项目中,程序在查询数据库时触发动画,当它接收到响应数据时,会自动触发另一个动画来显示数据。
-(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秒或更长时间过去。之后,再次调用此循环时,第二个动画将始终正常工作。怎么解决?
答案 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
});
}