2013-05-01 33 views
0

這是目前我在做什麼了循環滾動視圖:有沒有一種好方法來阻止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,但要防止遞歸特定的代碼段?

回答

3

我不會使用靜態BOOL,因爲靜態在類級別實現。如果你有兩個這個類的實例呢?他們會在腳下互相射擊!至少,使用一個實例變量(即一個屬性,並且不要聲明nonatomic以防萬一)。

+0

是的 - 謝謝。如果從第一個塊的內部調用,其中一個塊將阻止另一個運行。 – jhabbott 2013-05-02 09:39:00

相關問題