添加和删​​除观察者问题

时间:2015-02-16 11:24:17

标签: ios nsnotificationcenter ecslidingviewcontroller

我有一个视图控制器" A"这是一个像这样的观察者注册,

-(void)viewWillAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}

我也在dealloc方法中移除了观察者。

来自视图控制器" A"用户去查看控制器" B"在哪里" localActionTaken"通知已发布。

一切正常,直到这个

现在我有另一个视图控制器" C"从哪个用户推送到控制器" A"并且来自" A"到" B"。 但问题出在这个" C" - >" A" - >" B",如果通知是在" B"观察者" A"会被通知两次!

如果我在这里遗失任何东西,请告诉我。

注意:我正在使用ECSlidingview和" A"和" C"是顶视图控制器。

-----------------更新-----------------

我必须根据对堆栈中特定视图控制器的检查,将removeObserver移动到viewWillDisappear。

3 个答案:

答案 0 :(得分:1)

在A和B之间导航时,观察到的通知数量是否累积(增长超过两次)。当从A< - >移动时,viewWillAppear将继续被调用。 B但是dealloc还没有被调用。所以也许viewWillAppear中的removeObserver出现了错误,导致在A上添加了多个观察者,这将导致观察到多个通知。您包含的代码示例似乎适用于添加和删除以及在弹出回到C时的dealloc但我没有尝试使用“ECSlidingview”

答案 1 :(得分:0)

viewDidLoad

中添加观察者
- (void)viewDidLoad {
       [super viewDidLoad];
       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
    }

答案 2 :(得分:0)

您忘记了一件重要的事情,就是您需要在班上symmetric

如果您使用init方法添加通知,则会在dealloc方法中删除通知。

如果您使用viewWillAppear方法添加通知,则会删除viewWillDisappear方法中的通知(正如@Spetruk在评论中所述)。

所以,你可以这样做:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveLocalActionNotification:) name:@"localActionTaken" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated 
{ 
   [super viewWillDisappear:animated]; 

   [[NSNotificationCenter defaultCenter] removeObserver:self name:@"localActionTaken" object:nil]; 
}