Sphero Connecting:我应该在每个 UIViewController 中调用 setupRobotConnection 和 handleRobotOnline 还是每个应用只调用一次?

Posted

技术标签:

【中文标题】Sphero Connecting:我应该在每个 UIViewController 中调用 setupRobotConnection 和 handleRobotOnline 还是每个应用只调用一次?【英文标题】:Sphero Connecting: Should I call setupRobotConnection and handleRobotOnline in each UIViewController or only once per app? 【发布时间】:2013-05-10 20:02:15 【问题描述】:

我创建了一个具有 3 个启用 Sphero 的流的 ios 应用。我最终在每个 viewDidLoad 中在线重写了 setupRobotConnection 和 handleRobot,然后在每个 prepareForSegue 方法中关闭了连接。它在大多数情况下都有效,但 NavigationController 的后退按钮可能会搞砸。我认为这不是连接到 Sphero 并保持连接的最佳方式。

对于我的应用,每个流程对 handleRobotOnline 的需求略有不同 流程 1:无需驱动,需要 dataStreaming 和 AsyncData 流程 2:用于发送命令的多人游戏类。 流程 3:使用需要 dataStreaming 和 AsyncData 的 1 个视图的操纵杆驱动

我的问题是:对于多视图应用程序,最佳位置是: 1) 订阅应用通知? 2) 订阅机器人在线/离线通知? 3) 检查应用与机器人的连接类型是否正确(driveControl、sharedMultiplayer、dataStreaming)?

如果需要我可以粘贴代码

【问题讨论】:

【参考方案1】:

最好管理您与 Sphero 的连接并在一处打开/关闭它。我发现在 AppDelegate 或 RootViewController 中最容易做到这一点。

对于 AppDelegate:

在 applicationDidBecomeActive 和 applicationWillEnterForeground 上打开连接 在 applicationWillResignActive 和 applicationWillTerminate 上关闭连接 在应用程序 didFinishLaunchingWithOptions 中注册机器人状态通知

如果您想在 RootViewController 中管理连接,请在加载时注册机器人通知以及上述相同的应用程序状态通知并执行相同的连接处理。

通过在您的 AppDelegate/RootViewController 中连接,您可以让其他 ViewController 不关心处理连接。如果您有逻辑在 AppDelegate/RootViewController 中通知用户,您可以让他们假设 Sphero 已连接,或者您可以共享状态。

至于您提到的特定用例,我建议如下: 1. 在 vi​​ewDidLoad 上添加数据流和响应观察器,您还应该在此处启用数据流。删除 viewDidUnload 上的观察者并禁用数据流。 2. 像往常一样使用这里的多人游戏类。 3. 在 vi​​ewDidLoad 上添加数据流和响应观察器,您还应该在此处启用数据流。删除 viewDidUnload 上的观察者并禁用数据流。正常发送摇杆滚动命令。

如果您想了解有关机器人连接状态更改的信息,您可以在每个视图 viewDidLoad/viewDidUnload 调用中注册/取消注册连接通知。

【讨论】:

以上是关于Sphero Connecting:我应该在每个 UIViewController 中调用 setupRobotConnection 和 handleRobotOnline 还是每个应用只调用一次?的主要内容,如果未能解决你的问题,请参考以下文章

尝试连接 sphero 时出错

不能在 Swift 中使用 Sphero 碰撞检测?

如何获得蓝牙状态STATE_CONNECTING

Sphero API 校准

增强现实的 SPHERO

有没有办法在android中自动连接Sphero