2

iOS 向けにプログラミングしていると、次のような状況に直面することがよくあります。

- (void)someMethod
{
    [self performSomeAnimation];

    //below is an action I want to perform, but I want to perform it AFTER the animation
    [self someAction];
}

- (void)performSomeAnimation
{
    [UIView animateWithDuration:.5 animations:^
    {
        //some animation here
    }];
}

このような状況に直面した場合、通常は次のように完了ブロック ハンドラーを使用できるように、アニメーション コードをコピー アンド ペーストするだけになります。

- (void)someMethod
{
    [self performSomeAnimation];


    //copy pasted animation... bleh
    [UIView animateWithDuration:.5 animations:^
    {
        //same animation here... code duplication, bad.
    }
    completion^(BOOL finished)
    {
        [self someAction];
    }];
}

- (void)performSomeAnimation
{
    [UIView animateWithDuration:.5 animations:^
    {
        //some animation here
    }];
}

この問題を解決する適切な方法は何ですか? 以下のようにコードのブロックをメソッドに渡し-(void)performSomeAction、アニメーションの完了時にそのブロックを実行する必要がありますか?

- (void)someMethod
{
    block_t animationCompletionBlock^{
        [self someAction];
    };

    [self performSomeAnimation:animationCompletionBlock];
}

- (void)performSomeAnimation:(block_t)animationCompletionBlock
{
    [UIView animateWithDuration:.5 animations:^
    {
        //some animation here
    }
    completion^(BOOL finished)
    {
        animationCompletionBlock();
    }];
}

それはこの問題を解決する適切な方法ですか?私はブロックの使用法に精通しておらず(そのブロックを適切に宣言したかどうかさえわからない)、単純な問題に対する複雑な解決策のように見えるため、それを避けてきたと思います。

4

2 に答える 2

1

これを行うこともできます:

- (void)performSomeAnimationWithCompletion:(void(^)(void))animationCompletionBlock
{
    [UIView animateWithDuration:.5 animations:^
    {
        //some animation here
    }
    completion^(BOOL finished)
    {
        animationCompletionBlock();
    }];
}

また、ブロックを明示的に定義してパラメーターとして渡す代わりに、次のように直接呼び出すことができます (これは、たとえば、UIView のブロック アニメーションがどのように機能するかです)。

- (void)someMethod
{
    [self performSomeAnimationWithCompletion:^{

        [self someAction];

    }];
}
于 2012-09-12T18:26:33.077 に答える
0

私が理解できることから、あなたはすでにほとんど答えを持っているようです。 performSomeOperation への最初の呼び出しを削除するだけです:

- (void)someMethod

{

[UIView animateWithDuration:.5 animations:^
{
    //Your animation block here
}
completion: ^(BOOL finished)
{
    //Your completion block here
    [self someAction];
}];

}

于 2012-09-12T18:35:47.593 に答える