2011-07-29 142 views
7

我有一个班级管理来自和去iPad的外部附件的消息。在init我有以下代码:EAAccessoryDidConnectNotification为什么会发生两次?

- (id) init 
{ 
    self = [super init]; 
    if (!self) return; 

    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; //we want to hear about accessories connecting and disconnecting 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(accessoryDidConnect:) 
               name:EAAccessoryDidConnectNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(accessoryDidDisconnect:) 
               name:EAAccessoryDidDisconnectNotification 
               object:nil]; 
    ... 
} 

中的dealloc我

- (void) dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidDisconnectNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidConnectNotification object:nil]; 
    [[EAAccessoryManager sharedAccessoryManager] unregisterForLocalNotifications];  
} 

出于某种原因,当我外部附件连接到iPad的accessoryDidConnect:火灾后跟accessoryDidDisconnect:跟随通过accessoryDidConnect:

我想不通,为什么我会得到一个额外的连接和断开。有任何想法吗?

回答

3

更改该序列。首先通知注册然后为经理

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(accessoryDidConnect:) 
              name:EAAccessoryDidConnectNotification 
              object:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(accessoryDidDisconnect:) 
              name:EAAccessoryDidDisconnectNotification 
              object:nil]; 



[[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; //we want to hear about accessories connecting and disconnecting 
+0

更新,并检查了这一点 –

+0

好了,事情似乎现在工作正常。我现在只收到一次accessoryDidConnect/accessoryDidDisconnect消息,这很好。但是,它似乎与调用registerForLocalNotifications的顺序无关。但是,我发现的所有文档都是按照您在此处订购的顺序进行注册。我似乎稍微做了一些倒退。我认为真正的问题可能在EAAccessory对象的引用计数中。最近这段代码有很多代码更改,但它们不是我自己的。我与开发者交流了他们,并且... – Sam

+0

他不确定为什么这些通知现在只能进入一次。作为一个方面说明,我们的引用计数是关闭的,因为我们没有意识到线程增加了线程运行目标的引用计数。无论如何,我会将此标记为答案,即使我不能100%确定为何突然出现这种情况。 – Sam

2

没有答案,但我不能发表评论。我使用上面的答案中提供的代码也看到了这个双重通知。我也在Apple提供的EADemo示例代码中看到它。

+0

所以更改订单NSNotificationCenter观察员注册EAAcessoryNotification没有帮助?正如我上面所说,我不确定为什么突然这开始正常工作。我会仔细检查一次连接火灾的情况(正在开发一个新的应用程序,该应用程序还连接到不同的附件)。我记得之前这个问题让我疯狂。 – Sam

+0

+1参与关于此的讨论 – Sam

+0

正确 - 更改代码顺序没有什么区别。我也尝试在应用程序委托中设置通知,而不是我的rootviewController(仅仅因为它是可以尝试的)。然后,我尝试了Apple的演示,并获得了相同的连接/断开/连接行为。这不是我有的相机连接器 - 我也有一个midi mobilizer设备,并得到相同的结果。剩下的唯一一件事(我能想到的)是我的iPad连接器非常黑暗 - 或者我的libusb上有些东西在闪烁。我也在与Kinect/OpenNI合作 - 也许我把系统搞砸了。 –

5

的eaaccessory框架将永远火2连接,并从某些原因2个断开通知。第一个连接断开对将没有协议字符串,您可以忽略这些字符串。

0

答案是EAAccessoryDidConnectNotification

在一些情况下的文档上,前认证已完成,导致空protocolStrings阵列和随后的断开消息的连接通知可以被发送。如果发生这种情况,稍后会在身份验证成功时发送另一条连接消息。

绝对不应该一直发生,但如果您收到此连接/断开/连接序列,请检查协议字符串。这可能与认证失败有关。