ios - 如何确保代码不会被多次调用,但不会像dispatch_once 那样在整个程序执行中阻止它?

标签 ios objective-c cocoa-touch uiview uiscrollview

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

UIScrollView 为例,其中每次发生缩放时都会调用 scrollViewDidScroll: 方法。如果我想在第一次调用时使用 [UIView animateWithDuration...],但不允许后续调用“覆盖”已经播放的动画,该怎么办?

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

我该如何阻止后续调用将事情搞砸?

最佳答案

如果我理解的话,这样的事情应该可以工作(因为委托(delegate)总是从主线程调用):

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

    if (!busy) {
        busy = YES;

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

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

关于ios - 如何确保代码不会被多次调用,但不会像dispatch_once 那样在整个程序执行中阻止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21820450/

相关文章:

iphone - Core Data 同一类的两个实体

ios - 通话计时器在被叫方接听电话后立即开始计时

ios - Swift 覆盖协议(protocol)扩展保持扩展行为

iphone - 7次按键后UITextField崩溃

objective-c - 如何在今天午夜获取 NSDate 对象?

iOS 7 淡入淡出状态栏文本?

ios - addChildViewController 不适合 UIViewController

ios - iOS 10.3文本语音转换可在模拟器上运行,但不能在设备上运行

objective-c - 实例变量声明的顺序在 Objective-C 中重要吗?

cocoa-touch - View 逻辑应该放在 UIView 中还是(如果适用)它的 UIViewController 中?