如果CoreMotion的更新处理程序未完成足够快,该怎么办?

问题描述:

我注册从CMMotionManager收到像这样的更新:如果CoreMotion的更新处理程序未完成足够快,该怎么办?

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

    // ... handle data ... 
} 

其中deviceMotionQueueNSOperationQueue以最高的服务质量,即尽可能高的更新率:

self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive 

这意味着,我得到更新往往。真的很经常。所以我想知道:如果我不处理一个更新足够快,会发生什么?如果更新间隔比'处理数据'的执行时间短?运动经理会放弃一些信息吗?或者它会排队并在一段时间之后变得内存不足?或者这是不可行的?

很难知道内部的CoreMotion实现将会执行什么操作,并且即使您可以辨别其当前行为,但它所做的只是“实现细节”,您不会想要依靠这种行为前进。

我认为通常的解决方案是在动作更新处理程序中执行最少工作量的,然后自己管理工作/限速/ etc。所以,举例来说,如果你想丢弃到来,而你正在处理最后更新间质性更新,你可以有你进入CoreMotion做什么,但(安全)的deviceMotion副本添加到一个可变数组更新处理程序,然后将“真实”处理程序排入不同的队列。那么真正的处理程序可能有一个决策树,如:

  • 如果数组是空的,立即返回
  • 否则(安全)采取的最后一个元素,明确从阵列中的所有元素,并以此为基础进行工作最后一个元素

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

但外卖是这样的:如果你要确保有关这样的系统的行为,你必须自己管理。