2013-09-23 3 views
0

В моем приложении у меня есть несколько VC, которым необходимо получить NSNotifications из моей модели, которая извлекает данные асинхронно. Проблема в том, что VC исчезают время от времени, и когда модель завершает выборку данных и пытается отправить уведомление на VC, который уже ушел, приложение аварийно завершает работу. Есть ли возможность предотвратить этот сбой? Как сказать NSNotificationCenter «это нормально, если наблюдателя нет»?NSNotification - как предотвратить непредвиденные сбои?

:)

// Subscribe for notifications 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedLoading) name:@"Finished Loading" object:nil]; 

// Model sends a notification to a subscribed VC 
[[NSNotificationCenter defaultCenter] postNotificationName:@"Finished Loading" object:nil userInfo:nil]; 

ответ

2

Apple Documentation:

Обязательно вызвать этот метод (removeObserver: или removeObserver: имя: объект :) перед notificationObserver или какой-либо объект, указанный в addObserver: селектор: имя: объект: освобождается.

add the removeObserver call to dealloc наблюдателя.

- (void)dealloc{ 
... 
[[NSNotificationCenter defaultCenter] removeObserver:self ]; 
... 
} 
+1

Конечно, вы только назвать '[супер dealloc]', если вы используете MRC, не ARC. – rmaddy

+0

спасибо @rmaddy за указание! Я обновлю его. –

+0

Работал отлично! –

1

Я думаю, вам просто нужно сделать:

[[NSNotificationCenter defaultCenter] removeObserver:self ]; 
1

Вы должны вызвать NSNotificationCenter removeObserver... каждый раз вы называете addObserver.... Обычно это делается в методе dealloc.

0

Чтобы быть честным, при таком подходе вы смягчаете симптомы, а не лечите болезнь.

Если вы используете асинхронную сетевую библиотеку, такую ​​как AFNetworking, чтобы вернуть NSOperation экземпляров, тогда вам будет лучше управлять ими в NSOperationQueue. Затем, когда контроллер выталкивается в методе viewWillDisappear, отменить все выдающиеся асинхронные запросы:

[myOpQueue cancelAllOperations]; 
+0

Мне нравится ваш подход, но я просто использую [NSData dataWithContentsOfURL: @ ""] для извлечения данных. –

+0

так как вы планируете это асинхронно? Это должно быть с NSOperation или gcd? –

+0

Я использую GCD. –

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