有没有一种好方法可以防止Objective-C中特定位代码的递归?

时间:2013-05-01 23:33:37

标签: ios objective-c

以下是我目前正在为循环滚动视图做的事情:

// Call the on-scroll block
static BOOL inOnScrollBlock = NO;
if((_onScrollBlock != nil) && !inOnScrollBlock)
{
    inOnScrollBlock = YES;
    _onScrollBlock(self, self.loopOffset);
    inOnScrollBlock = NO;
}

这是循环滚动视图的setContentOffset。因此,用户可以在滚动时运行代码。如果您设置了其中两个,并且希望它们相互跟踪,那么对于您提供一个设置另一个的块,您可以获得一个递归的情况,它们会相互呼叫。

实际上在这种情况下它不是太糟糕,因为在执行所有更高级的东西之前,有一个单独的检查来查看设置的值是否已经设置,但是因为它是一个循环视图,所以有多个等价值,所以它可能发生几次。

无论如何,问题是在这种情况下防止递归。鉴于这是一个UI方法,因此只调用主线程,当你从块中调用一个合理的线程时,我的方法是捕获一个简单的标志吗?

是否有任何语言功能或框架模式(在iOS中可用) - 类似于@synchronizeddispatch_once但是为了防止特定代码段的递归?

1 个答案:

答案 0 :(得分:3)

我不会使用静态BOOL,因为静态是在类级别实现的。如果您有这个类的两个实例怎么办?他们会在脚下互相射击!至少,使用一个实例变量(即一个属性,并且不要声明它nonatomic,以防万一)。