如果CoreMotion的更新处理程序未完成足够快,该怎么办?
问题描述:
我注册从CMMotionManager
收到像这样的更新:如果CoreMotion的更新处理程序未完成足够快,该怎么办?
motionManager.startDeviceMotionUpdatesToQueue(deviceMotionQueue) {
[unowned self] (deviceMotion, error) -> Void in
// ... handle data ...
}
其中deviceMotionQueue
是NSOperationQueue
以最高的服务质量,即尽可能高的更新率:
self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive
这意味着,我得到更新往往。真的很经常。所以我想知道:如果我不处理一个更新足够快,会发生什么?如果更新间隔比'处理数据'的执行时间短?运动经理会放弃一些信息吗?或者它会排队并在一段时间之后变得内存不足?或者这是不可行的?
答
很难知道内部的CoreMotion实现将会执行什么操作,并且即使您可以辨别其当前行为,但它所做的只是“实现细节”,您不会想要依靠这种行为前进。
我认为通常的解决方案是在动作更新处理程序中执行最少工作量的,然后自己管理工作/限速/ etc。所以,举例来说,如果你想丢弃到来,而你正在处理最后更新间质性更新,你可以有你进入CoreMotion做什么,但(安全)的deviceMotion
副本添加到一个可变数组更新处理程序,然后将“真实”处理程序排入不同的队列。那么真正的处理程序可能有一个决策树,如:
- 如果数组是空的,立即返回
- 否则(安全)采取的最后一个元素,明确从阵列中的所有元素,并以此为基础进行工作最后一个元素
这会让你只读最近的阅读,但也知道错过了多少次更新,如果有用,那些错过的更新是什么。根据您的应用程序,将错过的事件批量处理为一个组可能会很有用。
但外卖是这样的:如果你要确保有关这样的系统的行为,你必须自己管理。