我正在注册接收来自CMMotionManager
的更新,如此:
motionManager.startDeviceMotionUpdatesToQueue(deviceMotionQueue) {
[unowned self] (deviceMotion, error) -> Void in
// ... handle data ...
}
其中deviceMotionQueue
是具有最高服务质量的NSOperationQueue
,即最高可能的更新率:
self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive
这意味着我经常获取更新。像往常一样。所以我想知道:如果我没有足够快地处理一个更新,会发生什么?如果更新间隔短于'处理数据的执行时间'?动议经理会丢弃一些信息吗?或者它会排队等待一段时间后内存不足?或者这根本不可行?
答案 0 :(得分:2)
很难知道CoreMotion的内部实现会做什么,并且考虑到它所做的是一个"实现细节",即使你能看出它的当前行为,你也不会#39 ; t想要继续前进的那种行为。
我认为通常的解决方案是在动作更新处理程序中执行最小工作量,然后自己管理工作/速率限制/等。因此,例如,如果您想删除在处理上次更新时到达的插页式更新,您可以让传递给CoreMotion的更新处理程序除了(安全地)将deviceMotion
的副本添加到可变数组,然后排队"真实"处理器在不同的队列上。然后,真正的处理程序可能有一个决策树,如:
这样可以让您只使用最近的阅读,但也可以了解错过了多少更新,如果有用,那些错过的更新是什么。根据您的应用程序,将错过的事件批量处理为一组可能很有用。
但需要注意的是:如果你想确定这样的系统是如何运作的,你必须自己管理它。