0

有人可以就创建多对一关系消息传递系统的最佳或实用方法向我提供建议。我是 Objective-C 的新手,所以如果这是我作为 Obj-C 开发人员“应该知道”的东西,请随时在教程/文档上为我指明正确的方向。

目前,我正在开发一个 Brick Breaker 游戏,以学习并在 Obj-C/Cocos2D/Box2D 上做得更好。我正在尝试在我的 BrickMgr 类中创建一个内部消息传递系统,该类包含砖块(NSMutableArray)的实例。当砖被破坏时,我想通知我的父母(BrickMgr)砖的得分值,以便它可以决定如何使用它或将它传达给平视显示器(HUD)。

从我所做的所有谷歌搜索/阅读来看,似乎 KVO 或 NSNotificationCenter 将是要走的路,但我读过的所有示例都是一对多的关系。我想知道我是否可以做相反的事情并以多对一关系的形式使用它。

例如:在我的 Brick 类的每个实例中,当砖被破坏时,我可以做

//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];

请指教。

4

1 回答 1

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];
}
于 2013-05-30T08:34:07.403 回答