CMMotionActivityManager queryActivityСтартовые данные недоступны вне закрытия - PullRequest
0 голосов
/ 25 октября 2018

У меня есть этот код, чтобы получить историческую активность при использовании 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 возвращает массив с данными, но 2-й оператор печати всегда пуст,Похоже, что 2-й оператор печати выполняется до того, как закрытие motionManager.queryActivityStarting завершит выполнение, и, следовательно, вернет пустой массив.

Как дождаться завершения закрытия перед выполнением 2-го оператора печати?

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 02 ноября 2018

Да, вы правы, второй отпечаток выполняется первым.Это связано с тем, что метод queryActivityStarting является асинхронным.

Согласно Документ Apple

Этот метод выполняется асинхронно, немедленно возвращается и доставляетрезультаты к указанному блоку обработчика.Ожидается задержка до нескольких минут в сообщаемых действиях.

Блок обработчика, который является вашим "замыканием", очень похож на функцию обратного вызова в js.

Итак, вы будетенужно написать свою бизнес-логику в этом блоке обработчика.Конечно, чтобы сохранить ваш код в чистоте, желательно вызывать другой метод вместо того, чтобы писать все в этом блоке.Кроме того, вы можете добавить наблюдателя в activityList , если хотите получать уведомления (затем вызывать другие функции), когда его значение изменяется.

...