NSNotificationCenter接收事件方法正在执行多次

时间:2010-12-02 13:45:54

标签: iphone objective-c

我基本上是一名Java开发人员,最近在目标C(iPhone)上分配了一项任务。

我已开始用该语言编码。但在实施NSNotificationCenter时,我遇到了非常奇怪的问题

很难解释我的问题。

我的A类有一个名为数组的全局变量 NSMutableArray 指针。 class的init方法看起来像

- (id) init  
{  
  if(self = [init])  
  {  
    [NSNotificationCenter defaultCenter] addObserver:self @selector(successLogin) name:"successLogin" object:nil];  
    [NSNotificationCenter defaultCenter] addObserver:self @selector(failureLogin) name:"failureLogin" object:nil];  
   ... <some code>  

}

收到事件方法看起来像

- (void) successLogin: (NSNotification * ) notification
{  
   ... <some code of writing data to db using **array**>  
   [self showSuccessAlert]; // it is showing UIAlert
}

sendEvent方法(其他类B)的代码类似于

[[NSNotificationCenter defaultCenter] postNotificationName:@"successLogin" object:nil];

A类有一个按钮“验证”,它调用B类的方法并验证用户输入的用户ID和密码。如果登录成功,则观察者通知观察者然后将登录信息添加到数据库。该应用程序允许更新db以进行5种不同的登录。 (用户ID和密码)

如果我输入第一条记录就可以了。当我再添加一个登录信息时,通知警报会出现两次。当我再添加一个时,它需要三次,依此类推。它还使用第一次记录添加时的数组值更新db

但是当我输入第一条记录并退出应用程序时(通过从iPhone的最小化列表中移除应用程序以及模拟器)并再次运行它并尝试添加第二条记录。它正确添加它。因此,对于5次添加,我必须重复上述循环,这对用户来说当然不方便。

请帮我把这个问题拖出来。

4 个答案:

答案 0 :(得分:5)

经过多方努力,我终于得到了解决方案 以下是我想与您分享的解决方案。

我的A类有一个“Add New”按钮,它调用B类连接和验证id和密码。 B类根据输出(成功或失败)发布通知,该通知应由A类处理。

我在dealloc方法中编写了remove observer,这实际上导致了问题,因为该方法根本没有被调用。

因此我在我的处理程序事件方法中移动了代码。现在我的方法看起来像这样

`

- (void) successLogin: (NSNotification * ) notification
{  
   ... <some code of writing data to db using **array**>  
   [self showSuccessAlert]; // it is showing UIAlert  

[[NSNotificationCenter defaultCenter] removeObserver: self];  
}  

`

此外,我将addObserver的代码从 init 转移到 AddNewButtonAction 。 事情开始正常。

答案 1 :(得分:2)

您可以分享更多代码吗?根据您发布的内容,可能会发生通知,因为您正在初始化多个A类实例,即订阅其他通知?如果不了解如何定义和访问全局数组和A类

,很难提供帮助

答案 2 :(得分:2)

您是否考虑过使用委托模式实现此目标?

A可以成为B的代表,而B可以在其代表中调用您想要的任何方法。

答案 3 :(得分:1)

您只需删除NSNotification对象的观察者。因为您的init方法可能会被多次调用。所以它自我添加NSNotification多次。

请在通知通知后删除观察者[[NSNotificationCenter defaultCenter] removeObserver: self];self表示NSNotification。

希望这会对你有所帮助。