1

我註冊從CMMotionManager收到像這樣的更新:如果CoreMotion的更新處理程序未完成足夠快,該怎麼辦?

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

    // ... handle data ... 
} 

其中deviceMotionQueueNSOperationQueue以最高的服務質量,即儘可能高的更新率:

self.deviceMotionQueue.qualityOfService = NSQualityOfService.UserInteractive 

這意味着,我得到更新往往。真的很經常。所以我想知道:如果我不處理一個更新足夠快,會發生什麼?如果更新間隔比'處理數據'的執行時間短?運動經理會放棄一些信息嗎?或者它會排隊並在一段時間之後變得內存不足?或者這是不可行的?

回答

2

很難知道內部的CoreMotion實現將會執行什麼操作,並且即使您可以辨別其當前行爲,但它所做的只是「實現細節」,您不會想要依靠這種行爲前進。

我認爲通常的解決方案是在動作更新處理程序中執行最少工作量的,然後自己管理工作/限速/ etc。所以,舉例來說,如果你想丟棄到來,而你正在處理最後更新間質性更新,你可以有你進入CoreMotion做什麼,但(安全)的deviceMotion副本添加到一個可變數組更新處理程序,然後將「真實」處理程序排入不同的隊列。那麼真正的處理程序可能有一個決策樹,如:

  • 如果數組是空的,立即返回
  • 否則(安全)採取的最後一個元素,明確從陣列中的所有元素,並以此爲基礎進行工作最後一個元素

這會讓你只讀最近的閱讀,但也知道錯過了多少次更新,如果有用,那些錯過的更新是什麼。根據您的應用程序,將錯過的事件批量處理爲一個組可能會很有用。

但外賣是這樣的:如果你要確保有關這樣的系統的行爲,你必須自己管理。

相關問題