【问题标题】:What If the Updates Handler for CoreMotion Does Not Finish Fast Enough?如果 CoreMotion 的更新处理程序没有足够快地完成怎么办?
【发布时间】: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

这意味着我经常收到更新。真的很经常。所以我想知道:如果我没有足够快地处理一次更新会发生什么?如果更新间隔比“处理数据”的执行时间短?运动管理器会丢弃一些信息吗?或者它会排队并在一段时间后耗尽内存?或者这根本不可行?

【问题讨论】:

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


    【解决方案1】:

    很难知道内部 CoreMotion 实现会做什么,并且考虑到它所做的是一个“实现细节”,即使您可以辨别其当前行为,您也不会希望依赖该行为向前发展。

    我认为常见的解决方案是在运动更新处理程序中完成最少量的工作,然后自己管理工作/速率限制/等。因此,例如,如果您想删除在处理最后一次更新时到达的插页式更新,您可以让传递给 CoreMotion 的更新处理程序什么都不做,只是(安全地)将deviceMotion 的副本添加到可变数组,然后将“真实”处理程序排入另一个队列。真正的处理程序可能有一个决策树,如:

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

    这样可以让您只阅读最近的阅读内容,而且还可以了解错过了多少更新,如果有用,还可以了解哪些错过的更新。根据您的应用,将错过的事件作为一个组进行批处理可能会很有用。

    但要点是:如果您想确定这样一个系统的行为方式,您必须自己管理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多