CMMotionActivityManager queryActivityStarting 数据在关闭之外不可用
Posted
技术标签:
【中文标题】CMMotionActivityManager queryActivityStarting 数据在关闭之外不可用【英文标题】:CMMotionActivityManager queryActivityStarting data not available outside closure 【发布时间】:2018-10-25 10:39:47 【问题描述】:我有这段代码可以使用 CoreMotionActivity 获取历史运动活动。
func buildActivityArray() -> Array<Any>
let now = Date()
let then = Date().addingTimeInterval(-3600)
var motionManager: CMMotionActivityManager!
motionManager = CMMotionActivityManager()
var activityList: [Any] = []
motionManager.queryActivityStarting(from: then, to: now, to: .main) motionActivities, error in
if let error = error
print("error: \(error.localizedDescription)")
return
motionActivities?.forEach activity in
if activity.confidence == .medium || activity.confidence == .high
if activity.stationary
activityList.append("stationary")
activityList.append(Int(activity.timestamp))
else if activity.walking
activityList.append("walking")
activityList.append(Int(activity.timestamp))
else if activity.running
activityList.append("running")
activityList.append(Int(activity.timestamp))
print("** activityList = ", activityList)
print("* activityList = ", activityList)
return(activityList)
第一个打印语句返回包含数据的数组,但第二个打印语句始终为空。看起来第二条打印语句在 motionManager.queryActivityStarting 闭包完成执行之前执行,因此返回空数组。
如何在执行第二个打印语句之前等待闭包完成?
感谢您的帮助
【问题讨论】:
【参考方案1】:是的,你是对的,第二个打印首先执行。这是因为 queryActivityStarting 方法是异步的。
根据Apple's doc
此方法异步运行,立即返回并将结果传递到指定的处理程序块。报告的活动预计最多会延迟几分钟。
作为“闭包”的处理程序块与 js 中的回调函数非常相似。
因此,您需要在此处理程序块中编写业务逻辑。当然,为了保持代码干净,建议调用另一个方法,而不是在这个块中写 all。此外,如果您希望在其值更改时收到通知(然后调用其他函数),您可以在 activityList 上添加观察者。
【讨论】:
以上是关于CMMotionActivityManager queryActivityStarting 数据在关闭之外不可用的主要内容,如果未能解决你的问题,请参考以下文章
CMMotionActivityManager 无法检测汽车模式
启动 CMMotionActivityManager 给 SIGABRT
用户不允许权限时的CMMotionActivityManager回调
CMMotionActivityManager queryActivityStarting 数据在关闭之外不可用