0

有人可以請建議我創建一個多對一的關係消息系統的最佳或實際的方式。我是Objective-C的新手,如果這是我應該「知道」的Obj-C開發人員,請隨時在教程/文檔中指出正確的方向。多對一的關係消息,KVO或NSNotification

目前,我正在開發一款Brick Breaker遊戲,以便在Obj-C/Cocos2D/Box2D上學習和使用。我正在嘗試在BrickMgr類中創建一個內部消息傳遞系統,該類包含磚塊實例(NSMutableArray)。當一塊磚被摧毀時,我想通知我的父母(BrickMgr)磚的分數值,以便它可以決定如何使用或將其傳遞給平視顯示器(HUD)。

從我所做的所有Googling /閱讀中,似乎KVO或NSNotificationCenter將成爲前進的方向,但我讀過的所有示例都是一對多的關係。我想知道我可以做相反的事情,並以多對一的關係來使用它。

例如:在我的磚類的每個實例,當磚被破壞,我可以做

//Brick class, when brick.state = BRICK_DESTROYED 
[NSNotificationCenter defaultCenter] postNotificationName:BB_SCORE_CHANGED_NOTIFICATION object:self userInfo:nil]; 

,並在我的BrickManager類註冊我的觀察者聽postNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onScoreChanged:) name:BB_SCORE_CHANGED_NOTIFICATION object:nil]; 

請建議。

回答

0

NSNotifications對多對多關係最有用,他們需要通知多個對象的變化。您的實施看起來不錯(例如,您還需要註銷dealloc內的通知)。

只要它是一對一的關係,您也可以使用委託(因爲每個對象 - 磚 - 將需要通知1個單個對象)。

你可以有例如:

// Brick.h 
@class Brick; 

@protocol BrickDelegate <NSObject> 
-(void)brickStateChanged:(Brick *)sender; 
// .. some other methods 
@end 

@interface Brick : NSObject { 
    id<BrickDelegate> _delegate; 
} 

@property(nonatomic, assign) id<BrickDelegate> delegate; 
@end 

// Brick.m 
@implementation Brick 
@synthesize delegate=_delegate; 

... 

-(void)setState:(int)newState{ 
    if(_state==newState) { 
     return; 
    } 
    _state=newState; 
    [self.delegate brickStateChanged:self]; 
} 

... 
@end 

某處在另一個類:

// in the init method for instance 
_bricks = [[NSMutableArray alloc] init]; 
Brick *b = [[Brick alloc] init]; 
b.delegate = self; 
[_brocks addObject:[b autorelease]]; 

-(void)brickStateChanged:(Brick *)sender { 
    // handle state changed for the brick object 
} 

-(void)dealloc{ 
    // reset the delegates - just in case the Brick objects were retained by some other object as well 
    [_bricks enumerateObjectsUsingBlock:^(Brick *b, NSUInteger idx, BOOL *stop){ 
     b.delegate = nil; 
    }]; 
    [_bricks release]; 
    [super dealloc]; 
} 
+0

你先生給我我所選擇的理想SOLN。我剛剛瞭解到代表最後一週的情況,這很棒。協議確保使用一組方法調用,並且它是自我記錄。由於我的新手身份,我還沒有開始考慮創造性地使用像上面這樣的代表。我陷入了思維模式,爲了實現委託,每個類類型只有一個實例必須存在。你睜開眼睛,拓寬了我的學習。現在我也可以觸發何時移除被毀壞的磚塊。 – badboy11