2013-03-13 98 views
1

在我的静态库的委托方法被触发后发生了一个奇怪的问题。首先,该项目有一个子项目,它是一个静态库(xcode 4.6 ios 6.x)。根据事件,静态库会激发自己的代理。 该应用程序实现了静态库的委托方法。在实现中,我使用以下来访问UI元素并触发其他事件。 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 2013-03-13 17:02:59

+1

如果方法从相同的通知中被触发两次,您正在订阅通知两次。您必须在其他地方再次订阅。 @bdesham是对的,但是,你的模式很奇怪 – jackslash 2013-03-13 17:55:02

+0

不要在委托方法中注册这个通知。 – iMash 2013-03-13 17:59:09

回答

1

经过深入调试,我发现添加oberserver实际上发生了两次。解决方案是删除oberserver,然后在WIFI断开连接的情况下添加它,并且日期流通过3G,并且这种情况下,我的代理人被解雇了两次,并注册了两次。

[[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 2016-07-14 18:50:01

相关问题