一个基于 Combine 的 CoreMotion 数据提供器,以 Swift Package 的形式提供。
在每次设备运动数据(加速度计和陀螺仪)更新时,它通过一个结构体
struct MotionData {
var timestamp : Date
var acc_x : Double // userAcceleration.x
var acc_y : Double // userAcceleration.y
var acc_z : Double // userAcceleration.z
var rot_x : Double // rotationRate.x
var rot_y : Double // rotationRate.y
var rot_z : Double // rotationRate.z
}
通过一个名为 motionWillChange
的 PassthroughSubject<MotionData, Never>
以及一个发布的属性 motion
提供数据。
如果设备上没有真实的地理位置数据(例如,模拟器),它会提供由定时器调度的随机伪运动数据。
初始化并启动 MotionProvider
let motionProvider = MotionProvider()
motionProvider.start()
订阅 motionWillChange
subject 并存储返回的 Cancellable
cancellableMotion = motionProvider.motionWillChange.sink { md in
handleMotion(md)
}
sink
闭包中的 handleMotion
函数会在 MotionProvider
发送的每个 MotionData
对象上执行。
此外,MotionProvider
是一个 ObservableObject,它具有一个发布的属性 motion
,该属性会更新 ObservableObject。这个动态属性可以直接在 SwiftUI 中访问。
停止 MotionProvider
并取消订阅
motionProvider.stop()
cancellableMotion?.cancel()