1

我试图在包含动画块的方法中返回一个值。我在下面的代码工作得很好,但似乎应该有更好或更清洁的方法来做到这一点。有一个更好的方法吗?

 + (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;
        }

    }
4

2 回答 2

2

您的代码存在竞争条件,因为您无法保证在flipImageAndTextForView:...方法返回之前正确设置 tempBool。transitionWithView:duration:options:animations:completion:不阻塞。在任何情况下,以下几行:

    if(tempBool)
    {
        return TRUE;
    }
    else{
        return FALSE;
    }

应该刚刚被替换为:

    return tempBool;

如果它以您编写的方式而不是第二种方式工作,那只是这里固有竞争条件的另一个症状。

最好的办法是根本不要像这样构造你的代码。要么imageFlipDisplayed完全在动画块之外进行测试,要么使用完成块transitionWithView:duration:options:animations:completion:向其他地方发送消息,其中包含动画完成时所需的信息。

于 2012-09-07T00:32:31.360 回答
0

问题是该值仅在动画开始时设置,这可能是runLoop的下一次迭代。您可以在 UIView 动画调用之前制作相同的文本,这似乎是一件合理的事情,或者您可以将完成块消息返回给某些东西。

于 2012-09-07T00:26:14.473 回答