我正在尝试在包含动画块的方法中返回一个值。我下面的代码可以很好地工作,但是似乎应该有一种更好或更干净的方法。有一个更好的方法吗?
+ (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;
}
}
最佳答案
您的代码具有竞争条件,因为您无法保证在flipImageAndTextForView:...
方法返回之前会正确设置tempBool。 transitionWithView:duration:options:animations:completion:
不阻止。无论如何,以下几行:
if(tempBool)
{
return TRUE;
}
else{
return FALSE;
}
应该被替换为:
return tempBool;
如果它按照您编写的方式而不是第二种方式起作用,则这只是固有竞争条件的另一种症状。
最好的办法是完全不要像这样构造代码。要么完全在动画块之外测试
imageFlipDisplayed
,要么使用transitionWithView:duration:options:animations:completion:
的完成块将动画完成时需要的信息发送到其他地方。