我有下一个代码:

@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

所以我在viewDidLoadviewDidDisappear方法的开头放置了断点。当我启动应用程序时,首先去viewDidload,下载后去viewDidDisappear

但是在我的应用程序中,我再次下载数据并发布notification: NSDownloadComplete。在此VC中,它是可行的,但后来我使用以下命令将其删除:
[[NSNotificationCenter defaultCenter] removeObserver:self]

此VC开始使用viewDidLoad一次,并且无法再次使用addObserver。

怎么了?

编辑
我尝试将addObserver方法添加到viewWillAppearviewWillDisappear-没有结果。
我之前添加NSLog(@"addObserver");
 [[NSNotificationCenter defaultCenter] addObserverForName...

在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方法中运行

最佳答案

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

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

@property(nonatomic, strong) id observer;

上课。然后您添加观察者与
self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:NCDownloadComplete object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *n){
    // ...
}];

并用删除
[[NSNotificationCenter defaultCenter] removeObserver:self.observer];

关于ios - removeObserver无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17022714/

10-10 21:11