-(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ミリ秒以内に呼び出されます。おそらくこれを行うことができますか?
背景として、関数は2回呼び出され、完了ブロックは別のアニメーションを呼び出すことになっています。2番目のアニメーションは確かに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
したがって、アニメーションの1つが適切に実行され、アニメーションの開始から10秒後にブロックが呼び出されます。
viewDidAddAnnotationで別のアニメーションが呼び出されているため、ブロックがすぐに呼び出される可能性がありますが、同時に多くの異なるアニメーションを呼び出すことができるため、そうではない可能性があります。
ほとんどのアニメーションは、まだほんの数ミリ秒で実行されます。3秒間実行されるものもあります。他のアニメーションは実行されるべきではありません。