我基本上是一名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次添加,我必须重复上述循环,这对用户来说当然不方便。
请帮我把这个问题拖出来。
答案 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。
希望这会对你有所帮助。