我正在尝试在包含动画块的方法中返回一个值。我下面的代码工作得非常好,但似乎应该有一个更好或更清晰的方法来做到这一点。有更好的方法吗?
+ (BOOL) flipImageAndTextForView:(UIView *) viewFlipImageAndText IsImageDisplayed:(BOOL) imageFlipDisplayed flipTextView:(UITextView *) textViewDonate flipImage: (UIImageView *)pictureImage{
__block BOOL tempBool;
[UIView transitionWithView:viewFlipImageAndText
duration:0.3f
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^(void) {
if (imageFlipDisplayed)
{
[viewFlipImageAndText bringSubviewToFront:textViewDonate];
tempBool = FALSE;
}
else
{
[viewFlipImageAndText bringSubviewToFront:pictureImage];
tempBool = TRUE;
}
}
completion:^(BOOL finished) {
NSLog(@"Done!");
}];
if(tempBool)
{
return TRUE;
}
else{
return FALSE;
}
}
答案 0 :(得分:2)
您的代码有竞争条件,因为您无法保证在flipImageAndTextForView:...
方法返回之前正确设置tempBool。 transitionWithView:duration:options:animations:completion:
不会阻止。无论如何以下几行:
if(tempBool)
{
return TRUE;
}
else{
return FALSE;
}
应该刚刚被替换为:
return tempBool;
如果它按你编写它的方式工作而不是第二种方式,那就是这里固有竞争条件的另一个症状。
最好的办法就是不要像这样构建你的代码。要么完全在动画块之外测试imageFlipDisplayed
,要么使用transitionWithView:duration:options:animations:completion:
的完成块将消息发送到其他地方,并带有动画完成时所需的信息。
答案 1 :(得分:0)
问题是该值仅在动画开始时设置,这可能是runLoop的下一次迭代。您可以在UIView动画调用之前创建相同的文本,这似乎是一件合理的事情,或者您可以将完成块消息恢复为某些内容。