removeObserver无法正常工作 [英] removeObserver not working

查看:434
本文介绍了removeObserver无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下一个代码:

@implementation SplashViewVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.splashView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Default.png"]];
    self.activityIndicator.originY = 355.f;
    [[NSNotificationCenter defaultCenter] addObserverForName:NCDownloadComplete object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *n){
        NSInteger errorCode = [n.userInfo[@"errorCode"] integerValue];        
        [self.activityIndicator stopAnimating];
        if (errorCode == ERROR_CODE_NO_CONNECTION) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Some problem with server" delegate:self cancelButtonTitle:@"try again" otherButtonTitles:nil];
            [alertView show];
        } else if (errorCode == 0) {
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    }];
    [self downloadData];
}

- (void)downloadData
{
    [self.activityIndicator startAnimating];
    [[Server sharedServer] getMovieData];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [self downloadData];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super viewDidDisappear:animated];
}

@end

所以我把断点放在开头 viewDidLoad 方法,在 viewDidDisappear 中。当我启动首先进入 viewDidload 的应用程序时,下载后转到 viewDidDisappear

So I put breakpoints in begin of viewDidLoad method, in viewDidDisappear. When I launch app that first go to viewDidload, after downloading it is go to viewDidDisappear.

但在我的应用程序中,我再次下载数据并发布通知:NSDownloadComplete 。在这个VC中它是有效的,但我稍后使用以下命令删除:

But during my app I again download data and post notification: NSDownloadComplete. And in this VC it is work, but I removed later using:

[[NSNotificationCenter defaultCenter] removeObserver:self]

此VC使用 viewDidLoad 一次开头&不能再添加服务器。

This VC use viewDidLoad once in the beginning & can not again addObserver.

有什么问题?

编辑
我尝试将addObserver方法放到 viewWillAppear viewWillDisappear - 没有结果。
我添加 NSLog(@addObserver); 之前

EDIT I try put addObserver method to viewWillAppear or viewWillDisappear - no results. I add NSLog(@"addObserver"); before

 [[NSNotificationCenter defaultCenter] addObserverForName...

在viewDidLoad中

in viewDidLoad

并写入

- (void)viewDidDisappear:(BOOL)animated
{
    NSLog(@"removeObserver");
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super viewDidDisappear:animated];
}

在日志中我看到:

2013-06-10 14:32:05.646 myApp[9390:c07] addObserver
2013-06-10 14:32:06.780 myApp[9390:c07] removeObserver

有什么问题?

编辑2
你可以看到必须删除观察者,但它在addObserver方法中再次运行块

EDIT 2 you can see that observer must be removed but it again run block in addObserver method

推荐答案

除了添加/删除观察者调用未正确平衡,在其他答案中注明,还有另一个问题。

Apart from add/remove observer calls not properly being balanced, at noted in the other answers, there is another problem.

删除观察者的代码是错误的。对于基于块的观察者,必须将 addObserver 返回值作为参数提供给 removeObserver 。所以你应该添加一个属性

Your code to remove the observer is wrong. For a block-based observer, the return value of addObserver must be given as argument to removeObserver. So you should add a property

@property(nonatomic, strong) id observer;

上课。然后添加观察者

self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:NCDownloadComplete object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *n){
    // ...
}];

并将其删除

[[NSNotificationCenter defaultCenter] removeObserver:self.observer];

这篇关于removeObserver无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆