如果 CoreMotion 的更新处理程序没有足够快地完成怎么办?

Posted

技术标签:

【中文标题】如果 CoreMotion 的更新处理程序没有足够快地完成怎么办?【英文标题】:What If the Updates Handler for CoreMotion Does Not Finish Fast Enough? 【发布时间】:2014-12-04 12:55:50 【问题描述】:

我正在注册以接收来自CMMotionManager 的更新,如下所示:

motionManager.startDeviceMotionUpdatesToQueue(deviceMotionQueue) 
    [unowned self] (deviceMotion, error) -> Void in

    // ... handle data ...

其中deviceMotionQueue 是具有最高服务质量的NSOperationQueue,即可能的最高更新率:

self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive

这意味着我经常收到更新。真的很经常。所以我想知道:如果我没有足够快地处理一次更新会发生什么?如果更新间隔比“处理数据”的执行时间短?运动管理器会丢弃一些信息吗?或者它会排队并在一段时间后耗尽内存?或者这根本不可行?

【问题讨论】:

【参考方案1】:

很难知道内部 CoreMotion 实现会做什么,并且考虑到它所做的是一个“实现细节”,即使您可以辨别其当前行为,您也不会希望依赖该行为向前发展。

我认为常见的解决方案是在运动更新处理程序中完成最少量的工作,然后自己管理工作/速率限制/等。因此,例如,如果您想删除在处理最后一次更新时到达的插页式更新,您可以让传递给 CoreMotion 的更新处理程序什么都不做,只是(安全地)将deviceMotion 的副本添加到可变数组,然后将“真实”处理程序排入另一个队列。真正的处理程序可能有一个决策树,如:

如果数组为空,立即返回 否则(安全地)取最后一个元素,清除数组中的所有元素,并根据最后一个元素进行工作

这样可以让您只阅读最近的阅读内容,而且还可以了解错过了多少更新,如果有用,还可以了解哪些错过的更新。根据您的应用,将错过的事件作为一个组进行批处理可能会很有用。

但要点是:如果您想确定这样一个系统的行为方式,您必须自己管理它。

【讨论】:

以上是关于如果 CoreMotion 的更新处理程序没有足够快地完成怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 watchkit 应用中启用 CoreMotion?

通过多线程分配 CoreLocation 和 CoreMotion 更新的最佳设计?

用于 CoreMotion 和准确计时目的的 NSThread、NSOperation 或 GCD?

如何在 WatchKit 中使用 CoreMotion?

CoreMotion 授权问题

CoreMotion 授权问题