2014-04-01 97 views
2

我有一堆包含在大約10個紋理地圖集中的動畫。我正在研究的這個項目中有一羣壞人跑來跑去,所以顯然我不應該在每次壞人類被實例化時重複所有的動畫。更好的選擇:Singleton還是dispatch_once?

我應該使用(選項A)一個單獨的類來存儲所有我的壞人的動畫,並將它返回一個特定的動畫時需要一個壞蛋類還是我插入(選項B):

static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
// do animating stuff here... 
}); 

進入我的壞人類?或者這是番茄與西紅柿的一個例子?

P.S.我真的很喜歡自己的班級方法,所以如果選項B是答案,一個可行的例子將非常感謝!

+0

如果您在本示例中使用真正的單身人士或共享實例或多或少相同。也就是說如果你有能力實例化獨立對象,你可能會在其他情況下更好地進行測試。 – vikingosegundo

+0

@vikingosegundo - 當你得到一個片刻時,我會很感激你重複你的建議,並將它貶低一些缺口,所以我也能理解它。 – sangony

+0

有很多文章爲什麼單身人士可能會咬你的**在測試中,只是谷歌它。 – vikingosegundo

回答

1

也許看看蘋果的code:Explained Adventure。在「加載共享字符資產」部分,他們使用:

static dispatch_once_t onceToken; 

dispatch_once(&onceToken, ^{ 

    sSharedIdleAnimationFrames = APALoadFramesFromAtlas(@"Boss_Idle", @"boss_idle", kBossIdleFrames); 
    // (Load other animation frames) 
    sSharedDamageEmitter = [SKEmitterNode apa_emitterNodeWithEmitterNamed:@"BossDamage"]; 
    sSharedDamageAction = [SKAction sequence:@[ 
     [SKAction colorizeWithColor:[SKColor whiteColor] colorBlendFactor:1.0 duration:0.0], 
     [SKAction waitForDuration:0.5], 
     [SKAction colorizeWithColorBlendFactor:0.0 duration:0.1]]]; 
} 
+0

謝謝。偉大的鏈接BTW。我從來沒有遇到過這種情況,而且內容非常豐富。 – sangony

1

要回答使用單例vs dispatch_once的問題,dispatch_once本身不是單例,而是經常用作在單例訪問器方法中實例化單例的方法。它將確保該程序塊在程序生命中只執行一次。我們可以使用它來確保我們只創建一次對象。

+(instancetype)sharedInstance { 
    static MySingletonClass *s_sharedPointer = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(onceToken, ^{ // ensures we only ever create one MySingletonClass 
     s_sharedPointer = [[MySingletonClass alloc] init]; 
    }); 
    return s_sharedPointer; 
} 

我不熟悉Spritekit或動畫的細微差別,所以我無法提供有關您的特定問題的細節,但我希望我的回答提供了一些方向。希望對動畫有更多瞭解的其他人可以通過更好地瞭解一個好的課堂設計來回答問題。

相關問題