我如何确保多次调用代码,但不像dispatch_once一样阻止整个程序执行?

2 cocoa-touch objective-c uiscrollview uiview ios

假设有一些我想确保在它被执行时永远不会被调用的东西.

例如UIScrollView,scrollViewDidScroll:每当发生任何缩放时调用该方法的位置.如果我想[UIView animateWithDuration...]第一次调用它,但不允许后续调用"覆盖"已播放的动画,该怎么办?

dispatch_once 如果它不是因为它只允许它在每个程序执行时运行一次,当我需要它运行多次,而不是同时覆盖另一个时,它将完美地工作.

我怎样才能阻止后续调用搞砸了?

rma*_*ddy 5

如果我理解那么这样的东西应该工作(因为委托总是从主线程调用):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    static BOOL busy = NO;

    if (!busy) {
        busy = YES;

       [UIView animateWithDuration:0.2 animations:^{
           // your animations
       } completion:^(BOOL finished) {
           busy = NO;
       }];
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码确保动画只能一次发生一个.