2013-03-13 2 views
1

Странная проблема возникает после того, как запущен метод делегата моей статической библиотеки. в первую очередь, проект имеет субпроект, который является статической библиотекой (xcode 4.6 ios 6.x). Статический lib запускает свои собственные делегаты в соответствии с событием. Приложение реализует метод делегирования статической библиотеки lib. в реализации я использую следующее для доступа к элементам пользовательского интерфейса и запуска других событий. Didgetnotified - это метод делегата lib.Селектор внутри метода делегата триггеры дважды

- (void)didGetNotified 
    { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [self parseData]; 

    NSNotificationCenter *notifyCenter = [NSNotificationCenter defaultCenter]; 

    [notifyCenter addObserver:self 
         selector:@selector(updateUI) 
          name:@"updateUIN" 
         object:nil]; 
    }); 
    } 

    -(void) parseData { 

    //parse data and its ready now and send notification 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateUIN" object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"updateUIN" object:nil]; 
    } 

    -(void) updateUI { 
    //this method gets fired twice mostly 
    } 

проблема в том, что вызов updateUI вызван дважды. я не могу понять, что я делаю неправильно. это что-то с резьбой? статический делегат lib не находится в основном потоке. но я использую отправку по основному потоку. может кто-нибудь объяснить? благодарю заранее.

+2

Похоже, вы вызываете уведомление «updateUIN», которое будет улавливаться текущим объектом. Это то, что вы хотите? (Что вы пытаетесь сделать с уведомлением «updateUIN», и почему он также подписывается на этот объект?) – bdesham

+1

Если метод дважды запускается из одного уведомления, вы подписываетесь на уведомление дважды. Вы должны подписываться снова в другом месте. @bdesham прав, однако, ваш шаблон здесь нечетный – jackslash

+0

Не регистрируйте это уведомление в методе делегата. – iMash

ответ

1

После интенсивной отладки я обнаружил, что добавление oberserver на самом деле произошло дважды. решение заключалось в том, чтобы удалить oberserver, прежде чем добавлять его в случае разъединения WIFI, и поток даты идет через 3G, и в этом случае мой делегат был дважды уволен и зарегистрирован в Oberver 2 раза.

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

NSNotificationCenter *notifyCenter = [NSNotificationCenter defaultCenter]; 
[notifyCenter addObserver:self 
        selector:@selector(updateUI) 
         name:@"updateUIN" 
        object:self]; 
+1

У меня была аналогичная проблема, но в моем случае я создавал наблюдателя в методе init. Я думал, что у меня только один экземпляр этого объекта, но на самом деле у меня было два, поэтому наблюдатель создавался дважды. Когда я исправил проблему с двумя объектами вместо одного, проблема с уведомлением была исправлена. – itnAAnti

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