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 数据在关闭之外不可用

Swift CMMotionActivityManager 未显示正确的授权状态

是否可以获取 iOS 用户当前的 healthkit 状态?