如果 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 更新的最佳设计?