2014-02-21 2 views
1

У меня зарегистрировано 2 наблюдателей. Один из них находится в appDelegate, а другой - в myViewController. Когда я нахожусь в myViewController, я просто ожидаю получить два уведомления: один из appDelegate, который выполняет какой-то метод глобально, другой из myViewController, который выполняет какой-либо другой метод. Но только тот, который вызван в appDelegate. Если я удалю наблюдателя в appDelegate, вызывающий наблюдатель в myViewController вызывается. Фактически, я могу просто использовать метод observer в appDelegate и узнать текущий контроллер представления и выполнить код метода в myViewController. Но я просто не хочу испортить appDelegate. Тот же код для обоих из них, но я удаляю наблюдателя в myViewController при вызове метода viewWillDisappear(). Есть идеи? Благодарю.NSNotification несколько наблюдателей, только один из них называется

AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(someMethod:) 
               name:@"someName" 
               object:nil]; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"someName" 
                 object:nil 
                 userInfo:someUserInfo]; 
} 

- (void)someMethod:(NSNotification *)notification 
{ 
    // gets called 
} 

myViewController

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

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(someMethod:) 
               name:@"someName" 
               object:nil]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:@"someName" 
                object:nil]; 

    [super viewWillDisappear:animated]; 
} 

- (void)someMethod:(NSNotification *)notification 
{ 
    // not called 
} 
+0

разместить код у используемого для размещения уведомления – CoolMonster

+0

также, где вы регистрации/удаления ваших наблюдателей? –

+0

Спасибо за ваши комментарии. Я редактировал сообщение. Взгляни. – Sukhrob

ответ

2

В коде ниже вы разместили перед наблюдением

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"someName" 
                 object:nil 
                 userInfo:someUserInfo]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(someMethod:) 
               name:@"someName" 
               object:nil]; 
} 

* Оригинал * Множество возможных проблем здесь:

один уведомление Имя может быть записано неправильно = @ «SomeName» - Если это будет наблюдать красный от других классов, подумайте о создании

в .h (что оба класса импорта) включают в себя

extern NSString * const XXXSomeNameForSomeNotification; 

в соответствующем .m

NSString * const XXXSomeNameForSomeNotification = @"someName"; 

Это один из способов гарантировать, что они все наблюдают/публикуют правильное уведомление

Если это не ваша проблема, попробуйте добавить наблюдение за уведомлением из viewDidLoad или другим методом, который вызывается до viewDidAppear, поскольку это может быть так, что это не так. наблюдая за вами уведомление, когда оно действительно отправлено. Добавьте точки останова, чтобы наблюдать это.

+0

Спасибо за ваш ответ. На самом деле, я так делаю. Я просто предоставил псевдокод, который точно такой же. Я просто не хотел быть слишком многословным :). – Sukhrob

+0

Я добавил еще один пункт – AppHandwerker

+0

Также обновите его снова – AppHandwerker

0

Я думаю, как на вас вывешено код причина

- (void)viewWillDisappear:(BOOL)animated 
{ 

[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:@"someName" 
               object:nil]; 

[super viewWillDisappear:animated]; 

} 

Описанный выше метод удалит уведомление наблюдения, если текущий вид не на экране.

Также вы можете переместить

[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:@"someName" 
               object:nil]; 

к

- (void) dealloc 
{ 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:@"someName" 
                object:nil]; 
} 

таким образом вы только остановить наблюдения уведомления, когда вы удалите вид формы контроллер памяти. Вы можете проверить метод, который вызывается, если вы находитесь на экране.

+0

Спасибо за ваш ответ. Зачем? Я просто удаляю наблюдателя в myViewController, а не из appDelegate. – Sukhrob

+0

Перед тем, как внести изменения, вы отправляли уведомление, прежде чем добавлять его, чтобы он не вызывал appdelegate. Для вашего уведомления о комментариях обязательно будет срабатывать приложение appdelegate. Но, для которого когда-либо класс был удален не для них. Потому что всякий раз, когда вы просматриваете диспетчер, он исчезнет с экрана, он вызовет этот метод исчезновения. – Exploring

+0

Пожалуйста, посмотрите мой последний комментарий. Спасибо – Sukhrob

0

Похоже, ваше уведомление отправлено до загрузки. См. Добавление некоторых журналов.

ИЛИ попробовать это -

double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"someName" 
                  object:nil 
                  userInfo:someUserInfo]; 
    }); 
+0

Спасибо за ваш ответ. Да ты прав. Пожалуйста, посмотрите последний комментарий, который я добавил. – Sukhrob

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