用户可以通过滑动手势启动动画。我想阻止对动画的重复调用,以确保动画一旦开始,在完成之前不能再次启动——如果用户不小心多次滑动,可能会发生这种情况。
我想大多数人使用布尔标志 ( BOOL isAnimatingFlag
) 以底部显示的方式实现此控制。我以前在应用程序中做过很多次这样的事情——但我从来没有 100% 确定我的标志是否保证具有我想要的值,因为动画使用块并且我不清楚我的动画完成的线程是什么块正在运行。
这种方式(阻止重复动画)对于多线程执行是否可靠?
/* 'atomic' doesn't
* guarantee thread safety
* I've set up my flag as follows:
* Does this look correct for the intended usage?
*/
@property (assign, nonatomic) BOOL IsAnimatingFlag;
//…
@synthesize IsAnimatingFlag
//…
-(void)startTheAnimation{
// (1) return if IsAnimatingFlag is true
if(self.IsAnimatingFlag == YES)return;
/* (2) set IsAnimatingFlag to true
* my intention is to prevent duplicate animations
* which may be caused by an unwanted double-tap
*/
self.etiIsAnimating = YES;
// (3) start a new animation
[UIView animateWithDuration:0.75 delay:0.0 options:nil animations:^{
// animations would happen here...
} completion:^(BOOL finished) {
// (4) reset the flag to enable further animations
self.IsAnimatingFlag = NO;
}];
}