我在viewDidLoad
添加了一个观察者,问题是如果我弹出并再次来到同一个类,它会多次添加观察者。
以下是添加观察者的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"PaymentRecieved" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PaymentRecieved:)
name:@"PaymentRecieved"
object:nil];
}
在某些进程之后,通知将从其他视图控制器发布。以下是相同的代码:
ViewController B:
-(void)CardAccepted
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"PaymentRecieved" object:self userInfo:nil];
}
主要问题是removeObserver
无效。如果我弹回5次然后再推到同一个屏幕5次,则添加观察者并全部射击5次。
我已经尝试了Stack Overflow上可用的所有内容,但似乎没有任何工作。以下是我尝试的一些事情:
试验1:
BOOL isPaymentObserverAdded = [DefaultsValues getBooleanValueFromUserDefaults_ForKey:@"isPaymentObserverAdded"];
if (!isPaymentObserverAdded) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"PaymentRecieved" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PaymentRecieved:)
name:@"PaymentRecieved"
object:nil];
}
}
[DefaultsValues setBooleanValueToUserDefaults:YES ForKey:@"isPaymentObserverAdded"];
试验2:
static dispatch_once_t lock;
dispatch_once(&lock, ^{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PaymentRecieved:)
name:@"PaymentRecieved"
object:nil];
});
我知道在完全相同的问题上有很多关于SO的类似问题但是没有一个能解决我的问题。除此之外,我还在此屏幕上设置了其他几个通知。
是的,请帮助我了解我做错了什么?答案 0 :(得分:0)
您应该将它添加到dealloc方法中,而不是删除viewDidLoad中的观察者。
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
这将删除对象已订阅的所有通知观察者,并且在使用几乎所有自定义对象的观察者时都是很好的做法。
答案 1 :(得分:0)
当用户从屏幕弹出时尝试removeObserver。就像你的背部动作方法一样。
喜欢这个:
- (无效)backAction {
[NSNotificaitonCenter defaultCenter] removeObserver:self name:@"Your Notification name" object:nil]];
}
答案 2 :(得分:0)
你可以删除后退按钮上的观察者。它会工作。我在一周前通过这样做解决了这个问题