2015-10-14 4 views
1

Я действительно хочу, чтобы результаты выполнялись с HKSampleQuery. Но я не могу получить результаты сразу после выполнения запроса.Как использовать образец набора образцов для здоровья прогрессивными способами

Мой случай ниже (код обработки ошибок удаляется):

let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false) 

// get the latest step count sample 
let stepSampleQuery: HKSampleQuery = HKSampleQuery(sampleType: (stepCountQty)!, 
    predicate: nil, 
    limit: 1, 
    sortDescriptors: [sortDescriptor]) { 
     (query, results, error) -> Void in 

     if let result = results as? [HKQuantitySample] { 
      // result[0] is the sample what I want 
      self.lastStepDate = result[0].startDate 
      print("readLastStep: ", self.lastStepDate) 
     } 
} 
self.healthStore.executeQuery(query) 
// now, I want to use the "self.lastStepDate" 
// But, I cannot get the appropriate value of the variable. 

Я не думаю, что код должен выполняться постепенно. Когда resultHandler из HKSampleQuery бежать? Я действительно хочу, чтобы код обработчика запускался, прежде чем использовать результаты запроса.

ответ

1

Когда resultsHandler работает документирована в HKSampleQuery reference:

После инстанцировании запроса, вызовите ExecuteQuery Класс HKHealthStore в: метод для выполнения этого запроса. Запросы выполняются на анонимной фоновой очереди. Как только запрос будет завершен, обработчик будет выполнен в фоновом режиме. Обычно вы отправляете эти результаты в основную очередь для обновления пользовательского интерфейса.

Поскольку запрос выполняется асинхронно, вы должны выполнять работу, которая зависит от результатов запроса в ответ на вызываемый resultsHandler. Например, вы можете сделать следующее:

// get the latest step count sample 
let stepSampleQuery: HKSampleQuery = HKSampleQuery(sampleType: (stepCountQty)!, 
    predicate: nil, 
    limit: 1, 
    sortDescriptors: [sortDescriptor]) { 
     (query, results, error) -> Void in 

     if let result = results as? [HKQuantitySample] { 
      // result[0] is the sample what I want 
      dispatch_async(dispatch_get_main_queue()) { 
       self.lastStepDate = result[0].startDate 
       print("readLastStep: ", self.lastStepDate) 

       self.doSomethingWithLastStepDate() 
      } 
     } 
} 
self.healthStore.executeQuery(query) 

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

+0

Но, я буду использовать переменную в запросе наблюдателя, который будет выполнен в фоновом режиме. Я знаю, что HKSampleQuery не может выполняться в фоновом режиме. Если я написал код о запросе наблюдателя в пространстве 'self.doSomethingWithLastStepDate', я думаю, что запрос наблюдателя не может использоваться в фоновом режиме –

+0

Я хочу, чтобы мое приложение запускалось в фоновом режиме. Запрос наблюдателя в моем приложении обнаруживает новые образцы в магазине HealthKit даже в фоновом режиме. Когда запрос наблюдателя познакомился с некоторыми образцами, мое приложение должно сравнить дату последнего шага и текущую дату. –

+0

Ничего не мешает выполнению запросов, когда ваше приложение находится в фоновом режиме. – Allan