2012-08-12 55 views
0

我正在研究一個合併Core Data的遊戲項目,我希望代碼儘可能模塊化。班級等級 - 誰應該和誰說話?

現在我的核心數據「層次」鏈是這樣的:

核心數據實體 - > SAVEGAME類 - > GameLogic類 - >接收機

遊戲存檔類處理相關的一切核心數據,例如作爲managedObjectContext,各種實體,保存和覆蓋操作等。

GameLogic類掌握着遊戲機制,並且對核心數據傳遞的數據做了一些事情,比如計算收入,當前金錢,處理級別變化等等。

雖然出於以下原因,我對此設置並不滿意:如果Receiver(例如HUD)從Core Data請求數據,那麼數據必須沿着該鏈傳遞,導致許多單線程那些幾乎什麼都沒有,這樣的:

+(NSArray *)passCoreDataInfo 
{ 
return [CoreDataEntity fetchCoreDataEntityInfo] // ExecuteFetchRequest 
} 

這將隨後在一個類中使用這樣低的層次結構:

+(NSArray *)passCoreDataInfoAgain 
{ 
return [HigherClass passCoreDataInfo] 
} 

直到某處鏈我的接收器確實有用的東西吧:

(...) 
NSArray *coreDataInfo = [SomeClass passCoreDataInfoYetAgain]; 
(...) 

這大概浪費了大量的內存和處理能力,但我也不想屈服於可怕的「每個人都在跟每個人交談」的模型。

你們可以給我一些提示,告訴我如何更好地設置y hiararchy並解決這個問題,並傳遞相同的數據嗎?

回答

0

爲什麼不讓Receiver訂閱從CoreDataEntities發送的(通用)消息?與其說是「每個人都在和每個人交談」模式,不如說是一個「每個人都可以關注他們感興趣的人的推文」的模型。

+0

這會爲「推」的消息,即CoreDataEntities「鳴叫」工作有關的任何更新到其後的其他對象。但OP要求「拉」消息傳遞,即其他對象要求CoreDataEntities提供最新數據,因此這些對象可能不希望從後者獲取所有'tweets'。 – Lukman 2012-08-13 14:05:53

0

爲什麼不創建共享實例,就像[CCDirector sharedDirector],[CCSpriteFrameCache sharedSpriteFrameCache],[CCTextureCache sharedTextureCache],[SimpleAudioEngine sharedEngine]等?

僅舉這[CoreDataEntity sharedEntity]或東西:

static CoreDataEntity *instanceOfCoreDataEntity = nil; 

@implementation CoreDataEntity 

+ (CoreDataEntity *)sharedEntity { 
    if (!instanceOfCoreDataEntity) { 
     instanceOfCoreDataEntity = [[CoreDataEntity alloc] initWithSomething:@"something"]; 
    } 
    return instanceOfCoreDataEntity; 
} 

.... 

然後你就可以在任何地方使用它:

NSArray *coreDataInfo = [[CoreDataEntity sharedEntity] passCoreDataInfo];