如果CoreMotion的更新处理程序无法快速完成怎么办?

时间:2014-12-04 12:55:50

标签: ios multithreading grand-central-dispatch nsoperationqueue core-motion

我正在注册接收来自CMMotionManager的更新,如此:

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

    // ... handle data ...
}

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

self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive

这意味着我经常获取更新。像往常一样。所以我想知道:如果我没有足够快地处理一个更新,会发生什么?如果更新间隔短于'处理数据的执行时间'?动议经理会丢弃一些信息吗?或者它会排队等待一段时间后内存不足?或者这根本不可行?

1 个答案:

答案 0 :(得分:2)

很难知道CoreMotion的内部实现会做什么,并且考虑到它所做的是一个"实现细节",即使你能看出它的当前行为,你也不会#39 ; t想要继续前进的那种行为。

我认为通常的解决方案是在动作更新处理程序中执行最小工作量,然后自己管理工作/速率限制/等。因此,例如,如果您想删除在处理上次更新时到达的插页式更新,您可以让传递给CoreMotion的更新处理程序除了(安全地)将deviceMotion的副本添加到可变数组,然后排队"真实"处理器在不同的队列上。然后,真正的处理程序可能有一个决策树,如:

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

这样可以让您只使用最近的阅读,但也可以了解错过了多少更新,如果有用,那些错过的更新是什么。根据您的应用程序,将错过的事件批量处理为一组可能很有用。

但需要注意的是:如果你想确定这样的系统是如何运作的,你必须自己管理它。