【问题标题】:Why does EAAccessoryDidConnectNotification occur twice?为什么 EAAccessoryDidConnectNotification 会出现两次?
【发布时间】:2011-07-29 14:41:29
【问题描述】:

我有一个类来管理来自和去往 iPad 外部附件的消息。在初始化中,我有以下代码:

- (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:

我不明白为什么我会获得额外的连接和断开连接。有什么想法吗?

【问题讨论】:

    标签: ios ipad nsnotificationcenter accessory


    【解决方案1】:

    eaaccessory 框架总是会出于某种原因触发 2 个连接和 2 个断开连接通知。第一个连接断开对将没有协议字符串,您可以忽略这些。

    【讨论】:

      【解决方案2】:

      改成这个顺序。先通知注册,然后为经理注册

      [[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
      

      【讨论】:

      • 好吧,现在看来一切正常。我现在只收到一次accessoryDidConnect / accessoryDidDisconnect 消息,这很好。但是,它似乎与调用 registerForLocalNotifications 的顺序无关。但是,我找到的所有文档都按照您在此处的顺序进行注册调用。我似乎有点倒退了。我认为真正的问题可能在于我对 EAAccessory 对象的引用计数。最近这个代码领域发生了很多代码更改,但不是我做的。我和做他们的开发人员谈过,然后......
      • 他不确定为什么这些通知现在只收到一次。附带说明一下,我们的引用计数已关闭,因为我们没有意识到线程增加了线程运行的目标的引用计数。无论如何,我会将此标记为答案,即使我不能 100% 确定为什么这突然会正常工作。
      • 因为 EAAccessoryManager 是包装器对象,它将处理之前的注册。所以在包装所有通知之前,您应该首先指定我需要获取这些通知
      • 这对我不起作用,即使设备已连接,它也不会调用 EAAccessoryDidConnectNotification 方法
      【解决方案3】:

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

      【讨论】:

      • 所以改变 NSNotificationCenter 观察者的顺序和注册 EAAcessoryNotification 没有帮助?正如我上面所说,我不确定为什么突然开始正常工作。我会仔细检查一次连接是否触发(在一个新的应用程序上工作,该应用程序也连接到不同的附件)。我记得以前这个问题让我发疯。
      • 正确 - 更改代码顺序并没有什么不同。我还尝试在应用程序委托而不是我的 rootviewController 中设置通知(只是因为它可以尝试)。然后我尝试了 Apple 的演示并获得了相同的连接/断开/连接行为。这不是我拥有的相机连接器 - 我也有一个 midi 动员设备并获得相同的结果。剩下的唯一一件事(我能想到的)是我的 iPad 连接器很狡猾 - 或者我的 libusb 出现了一些狡猾的问题。我也在使用 Kinect/OpenNI - 也许我在系统方面搞砸了。
      • 你有没有想过这个问题?如果没有,也许这个问题应该重新打开。
      • 不,还没有解决 + 还没有升级到 iOS 5 还没有测试它是否仍然是一个问题。当我尝试更改订单(根据上述)时,它没有任何区别。
      • iOS5 对这种情况没有帮助。连接时仍然发送两个通知。
      【解决方案4】:

      答案在EAAccessoryDidConnectNotification的文档中

      在某些情况下,连接通知可能会在身份验证完成之前发送,从而导致一个空的protocolStrings 数组和随后的断开连接消息。如果发生这种情况,稍后会在身份验证成功时发送另一条连接消息。

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

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2016-09-24
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多