Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CMMotionActivityManager查询ActivityStart数据在闭包外部不可用_Ios_Swift_Core Motion - Fatal编程技术网

Ios CMMotionActivityManager查询ActivityStart数据在闭包外部不可用

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()

我有这段代码可以通过使用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)
}

第一条print语句返回包含数据的数组,但第二条print语句始终为空。看起来第二条print语句在motionManager.QueryActivityStart闭包完成执行之前执行,因此返回空数组

在执行第二个print语句之前,如何等待闭包完成


谢谢您的帮助

是的,您是对的,第二次打印将首先执行。这是因为queryActivityStarting方法是异步的

此方法异步运行,立即返回并将结果传递给指定的处理程序块。预计报告的活动将延迟几分钟

作为闭包的处理程序块与js中的回调函数非常相似

因此,您需要在这个处理程序块中编写业务逻辑。当然,为了保持代码干净,最好调用另一个方法,而不是在这个块中编写所有的方法。此外,如果希望得到通知,可以在activityList上添加observer,然后在其值发生更改时调用其他函数