如何在动画块中返回一个值?

时间:2012-09-07 00:05:53

标签: ios xcode objective-c-blocks uiviewanimation

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

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

    }

2 个答案:

答案 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动画调用之前创建相同的文本,这似乎是一件合理的事情,或者您可以将完成块消息恢复为某些内容。