为什么立即调用完成块?

时间:2012-11-04 13:04:48

标签: objective-c xcode4.5

-(void) movePinsToDestinations:(NSArray *)destination withCompletion: (void (^)())block
{
    ...
    [UIView animateWithDuration:animationTime animations:^{
        //[self.ReloadBut setTitle:@"Animating " forState:UIControlStateNormal];
        for (BGAddressAnnotation * anExistingAnnotation in existingAnnotations) {
            if (anExistingAnnotation.destination) {
                anExistingAnnotation.coordinate = anExistingAnnotation.destination.coordinate;
            }
            else
            {
                anExistingAnnotation.myView.alpha = 0;
            }
        }
    } completion:^(BOOL finished){
        NSAssert(finished, @"Not Finished?");
        for (BGAddressAnnotation * existingAnnotation in existingAnnotations) {
            if ([existingAnnotation.destination.myBiz isEqual: existingAnnotation.myBiz]) {
                existingAnnotation.arrayOfBusinesses = existingAnnotation.destination.arrayOfBusinesses;
                existingAnnotation.myView.alpha=1;
            }
            else
            {
                [self.theMapView removeAnnotation:existingAnnotation];
            }
        }
//        PO([[self class] PrintAllAnnotations: [self annotationExceptUser]]);
//        PO([[self class] PrintAllAnnotations: destination]);
        PO(@"Reach Completion Block");
        if (block)
        {
            block();
        }
        else
        {
            //[self.ReloadBut setTitle:@"Animating Finish" forState:UIControlStateNormal];
        }
    }];
}

结果:

2012-11-04 20:00:05.800 @"Start Animating": Start Animating
2012-11-04 20:00:05.805 @"Reach Completion Block": Reach Completion Block

我将动画设置为运行10秒,然后在5毫秒内调用完成块。什么可以做到这一点?

某些背景,该函数被调用两次,完成块应该调用另一个动画。第二个动画确实在10秒内完成。指定完成块是否立即调用它或什么?

所以我有效地做了

[self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{
    }];
}];

更新

出于好奇,我多次嵌套动画。

[self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{
        [self movePinsToDestinations:emptyAnnotations withCompletion:^{
            [self movePinsToDestinations:startOff withCompletion:^{
                [self movePinsToDestinations:self.myCache.annotationsInterMediateState withCompletion:^{
                    [self movePinsToDestinations:self.myCache.annotationsWeShouldbeDisplaying withCompletion:^{

                    }];
                }];
            }];
        }];
    }];
}];

结果如下:

21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
21:51.9 Reach Completion Block: Reach Completion Block
21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
21:51.9 Reach Completion Block: Reach Completion Block
21:51.9 Start Animating: Start Animating
21:51.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block
22:01.9 Start Animating: Start Animating
22:01.9 (animationTime): 10
22:01.9 Reach Completion Block: Reach Completion Block

因此,其中一个动画正确完成,并在开始制作动画后10秒钟调用该块。

由于在viewDidAddAnnotation中调用了另一个动画,因此可能会立即调用该块,但是,由于可以同时调用许多不同的动画,因此不太可能出现这种情况。

大多数动画仍然只运行几毫秒。有些人跑了3秒钟。不应该运行其他动画。

2 个答案:

答案 0 :(得分:3)

  

可能会立即调用该块,因为在viewDidAddAnnotation中调用了另一个动画

这几乎可以肯定是原因。您可以使用多个动画,但如果两个动画在同一个对象上重叠,则第一个动画会被中断(默认情况下会跳转到结尾,但您可以设置一个选项以从其中恢复)。注释掉你的第二个动画以确认。

答案 1 :(得分:1)

这实际上是一个功能。当没有动画时,动画立即完成。我想知道是否有改变它的选择。

有时这是件好事。事情是在现有动画中没有任何动画,添加的动画需要独立动画。最终结果是添加的pinview动画与现有pinView的动画不同步

例如,执行self.ReloadBut.alpha = (float) random()/RAND_MAX;可以解决问题。

我想知道是否有更优雅的方式我可以在didAddAnnotationViews上执行整个动画。或者,如果我知道添加了一些新的引脚,我可以隐藏视图。

能够使用现有引脚同时为新添加的引脚设置动画,这真是太棒了。我会考虑一下。