多次添加NSNotification

时间:2017-10-20 14:14:43

标签: ios objective-c nsnotificationcenter

我在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的类似问题但是没有一个能解决我的问题。除此之外,我还在此屏幕上设置了其他几个通知。

是的,请帮助我了解我做错了什么?

3 个答案:

答案 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)

你可以删除后退按钮上的观察者。它会工作。我在一周前通过这样做解决了这个问题