我正在尝试在包含动画块的方法中返回一个值。我下面的代码可以很好地工作,但是似乎应该有一种更好或更干净的方法。有一个更好的方法吗?

 + (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:的完成块将动画完成时需要的信息发送到其他地方。

10-07 19:50
查看更多