Ios CMMotionActivityManager查询ActivityStart数据在闭包外部不可用
我有这段代码可以通过使用CoreMotionActivity获得历史运动活动Ios CMMotionActivityManager查询ActivityStart数据在闭包外部不可用,ios,swift,core-motion,Ios,Swift,Core Motion,我有这段代码可以通过使用CoreMotionActivity获得历史运动活动 func buildActivityArray() -> Array<Any> { let now = Date() let then = Date().addingTimeInterval(-3600) var motionManager: CMMotionActivityManager! motionManager = CMMotionActivityManager()
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)
}
第一条print语句返回包含数据的数组,但第二条print语句始终为空。看起来第二条print语句在motionManager.QueryActivityStart闭包完成执行之前执行,因此返回空数组
在执行第二个print语句之前,如何等待闭包完成
谢谢您的帮助是的,您是对的,第二次打印将首先执行。这是因为queryActivityStarting方法是异步的 据 此方法异步运行,立即返回并将结果传递给指定的处理程序块。预计报告的活动将延迟几分钟 作为闭包的处理程序块与js中的回调函数非常相似 因此,您需要在这个处理程序块中编写业务逻辑。当然,为了保持代码干净,最好调用另一个方法,而不是在这个块中编写所有的方法。此外,如果希望得到通知,可以在activityList上添加observer,然后在其值发生更改时调用其他函数