Removing a NSNotificationCenter observer in iOS 5 ARC

后端 未结 3 1066
轮回少年
轮回少年 2020-12-31 01:11

I have an iOS 5 ARC-based project, and am having difficulty about where I should be removing the observer for the NSNotificationCenter observations which I have

3条回答
  •  甜味超标
    2020-12-31 01:26

    "I also need the notification callbacks to still be fired if the view is off-screen" -> you may need to register UIApplicationWillEnterForegroundNotification. If so, let try this:

    - (void)viewWillAppear:(BOOL)animated {
        NSLog(@"viewWillAppear");
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(applicationDidEnterBackground:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:nil];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        NSLog(@"viewWillDisappear");
        [super viewWillDisappear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        NSLog(@"applicationWillEnterForeground");
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(applicationDidEnterBackground:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:nil];
        // do your stuff here
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        NSLog(@"applicationDidEnterBackground");
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(applicationWillEnterForeground:)
                                                     name:UIApplicationWillEnterForegroundNotification
                                                   object:nil];
    }
    

    The idea is adding or removing UIApplicationDidEnterBackgroundNotification whenever coming in and out of your screen. We just register UIApplicationWillEnterForegroundNotification when the app enter background and remove once it's back. Be noticed that we just remove UIApplicationDidEnterBackgroundNotification when viewWillDisappear.

    My dealloc() is not called by somehow, so I found this way, hope it useful for you too.

    Enjoy :)

提交回复
热议问题