2013-11-12 2 views
2

Я думаю, что должно быть здесь:Где лучшее место, чтобы удалить наблюдателя от Notification Center

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

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc removeObserver:self]; 

} 

или, возможно, в -dealloc.

Оба звучат странно для меня, поэтому я не совсем уверен в этом.

Во-первых, в моем AppDelegate I'm прослушивания удаленного оповещения Via Parse

- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [PFPush handlePush:userInfo]; 

    NSString * urlToGo = [userInfo objectForKey:@"url"]; 
    NSLog (@"Recibo notificación con paremetro url: %@", urlToGo); 


    NSNotification *note = [NSNotification 
          notificationWithName:PUSH_NOTIFICATION 
          object:self 
          userInfo:userInfo]; 

    [[NSNotificationCenter defaultCenter] postNotification:note]; 

} 

и myViewController - (Недействительными) viewDidLoad { [супер viewDidLoad];

_lastMenuSelected=menu1; 

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; 
    [center addObserverForName:PUSH_NOTIFICATION 
         object:nil 
         queue:mainQueue 
        usingBlock:^(NSNotification *note) { 

        // Save in property to load parameter in prepareForSegure 
         _urlToLoadFromPush = urlToGoReceivedFromPush; 
        [self showPush:self]; 

        }]; 


} 



- (void)showPush:(id)sender { 

    PushViewController * pushViewController=(PushViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"PushId"]; 

    pushViewController.url = _urlToLoadFromPush; 
    UINavigationController* nVC=[[UINavigationController alloc] initWithRootViewController:pushViewController]; 
    [self presentViewController:nVC animated:YES completion:^{ 
     //[_delegate logout]; 
    }]; 


} 
+8

Где вы добавляли наблюдателя? Удалите его с противоположного метода. – rmaddy

+2

rmaddy прав, но на всякий случай вы не вводили этот код в качестве примера, который вы вызываете. Super viewDidDisappear from viewWillDisappear – wattson12

+0

Почему существует код для делегата приложения и контроллера представления в том же файле? Или опубликованный код формирует разные классы? Если да, сделайте это ясно. – rmaddy

ответ

6

Поскольку вы, кажется, добавление наблюдателя в методе viewDidLoad (который вызывается только один раз, как из прошивки 6), вы должны удалить наблюдатель в методе dealloc.

+0

Дело в том, что он должен реагировать как на заднем плане, так и на видимом, поскольку мы говорим о push-уведомлениях, а также, если уведомление поступило, когда пользователь использует приложение –

+2

Контроллер представления должен удаляться при его освобождении, иначе ваше приложение будет аварийно завершено, если уведомление поступит после исчезновения контроллера. – rmaddy

2

Не удаляйте наблюдателя в поле зренияWillDisappear beacause, как правило, нам требуется отправить уведомление, когда представление находится в стеке, но не отображается. Поэтому всегда старайтесь удалять наблюдателей в - (void) dealloc с именем наблюдателя.

Смежные вопросы