Я пытаюсь понять это целый день, и я начинаю впадать в отчаяние ...
Итак, вот моя проблема:
У меня есть контроллер табличного представления, показывающий список файлов. Пользователь может загрузить новые файлы в этот список. Я занимаюсь загрузкой асинхронно в отдельном классе. Когда новый файл был загружен, я хочу уведомить контроллер табличного представления, чтобы он мог обновить список. Шаблон делегата здесь не совсем подходит, потому что нужно уведомить несколько экземпляров, поэтому я хочу использовать NSNotificationCenter.
В viewDidAppear контроллера вида: метод, который я регистрирую как наблюдатель:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(downloadComplete:)
name:kDownloadCompleteNotification
object:nil];
Это определенно вызывается перед публикацией уведомления, потому что пользователь должен нажать кнопку добавления на контроллере представления, чтобы начать новую загрузку. По завершении загрузки я отправляю уведомление (в классе DownloadManager):
[[NSNotificationCenter defaultCenter]
postNotificationName:kDownloadCompleteNotification
object:self];
Однако мой метод обработчика уведомлений в контроллере представления никогда не вызывается. Я добавил точки останова, и это просто не называется. Я также пытался установить объект на ноль. Без разницы.
- (void)downloadComplete:(NSNotification *)notification {
NSLog(@"Inserting new files into table view.");
}
Как регистрация, так и публикация уведомления осуществляются в главном потоке (я не думаю, что это все равно имеет значение). Контроллер вида не отпущен или еще что-нибудь. Насколько я могу судить, я не делал опечаток. Строки имени являются одной и той же константой.
Если при регистрации в качестве наблюдателя установить для аргумента name значение nil, я получаю все виды (системных) уведомлений, но не мои собственные. Однако, если я отправляю тестовое уведомление сразу после регистрации (в viewDidAppear), оно работает.
Я не знаю, что еще я должен проверить ... Любая подсказка очень ценится. Спасибо!