0

我正在构建一个程序,NSNotification因为我希望能够从另一个类传递信息,这将影响不同类中变量的值。

所以,我设置了以下内容:

categories.m班级:

viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTheScore:)name:@"TheScore" object:nil];

在同一个班级,我的updateTheScore功能:

- (void)updateTheScore:(NSNotification *)notification
{
NSLog(@"Notification Received. The value of the score is currently %d", self.mainScreen.currentScore);
[[NSNotificationCenter defaultCenter]removeObserver:self];
}

mainScreen.m

self.currentScore++;
[[NSNotificationCenter defaultCenter]postNotificationName:@"TheScore" object:self];

通常情况下,分数会从 0 更新到 1。

该程序将notification正确调用,因为我可以看到我NSLog正在执行。但是,变量的值没有通过,这就是我卡住的地方。

谁能想到为什么我的变量值没有通过的解决方案?

澄清一下,如果我在该postNotificationName行之前执行 NSLog 以向我显示 this 的值,self.currentScore;则返回 1,正如预期的那样。在updateTheScore函数中,它returns 0.

在此先感谢大家。

4

2 回答 2

2

我不知道为什么你会得到另一个预期的值。也许,因为你不在主线程上?你可以检查一下[NSThread isMainThread]

实际上,如果你想传递一个带有通知的对象,你可以使用 NSNotification 对象的 userInfo 属性。这是这样做的正确方法。NSNotificationCenter 的最大优势之一是,您可以在不知道发布者和接收者的情况下发布、接收通知。

你可以这样发布通知

[[NSNotificationCenter defaultCenter] postNotificationName:notificationName
                                                            object:self
                                                          userInfo:@{key:[NSNumber numberWithInt:value]}];

然后像这样接收

- (void)updateTheScore:(NSNotification *)notification
{
    NSInteger value = [[notification.userInfo objectForKey:key] intValue];
}
于 2013-05-27T12:50:25.117 回答
0

您正在记录self.mainScreen.currentScore。显而易见的问题是:self.mainScreen发布通知的对象是同一个对象吗?也许你有几个实例MainScreen(假设这是你的类的名称)。

self由于您在发布通知时附加了通知,您是否尝试过此操作?

int currentScore = (int)[[notification object] currentScore];
NSLog(@"Notification Received. The value of the score is currently %d", currentScore);
于 2013-05-27T12:49:59.020 回答