2014-12-27 4 views
1

В классе QueryHK запускаю запрос HealthKit для шагов и соответствующей даты. Я хотел бы записать эти данные в NSArray и вернуть его, чтобы я мог вызвать функцию в ViewController.Возвращаемые значения из функции пустые: Почему?

  • Вопрос: код из ViewController ничего не возвращает, и никакой ошибки. Почему возврат пуст?

Мне кажется, что запрос не «пишет в ответ».

QueryHK.swift:

import UIKit 
import HealthKit 

class QueryHK: NSObject { 

var steps = Double() 
var date = NSDate() 

func performHKQuery() -> (steps: Double, date: NSDate){ 

    let healthKitManager = HealthKitManager.sharedInstance 
    let stepsSample = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 
    let stepsUnit = HKUnit.countUnit() 
    let sampleQuery = HKSampleQuery(
     sampleType: stepsSample, 
     predicate: nil, 
     limit: 0, 
     sortDescriptors: nil) 
     { 
      (sampleQuery, samples, error) in 

      for sample in samples as [HKQuantitySample] 
      { 

       self.steps = sample.quantity.doubleValueForUnit(stepsUnit) 
       self.date = sample.startDate 

       println("Query HealthKit steps: \(self.steps)") 
       println("Query HealthKit date: \(self.date)") 

      } 
    } 
    healthKitManager.healthStore.executeQuery(sampleQuery) 
    return (steps, date) 
} 
} 

ViewController.swift:

import UIKit 

class ViewController: UIViewController { 

    var query = QueryHK() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     printStepsAndDate() 
    } 


    func printStepsAndDate() { 

    println(query.performHKQuery().date) 
    println(query.performHKQuery().steps) 

    } 
} 
+0

Проверьте объект vc1 не равен нулю. Также лучше переместить эти общие методы в другой класс и создать свой объект в vc1 и vc2, в свою очередь, вызвать метод –

+0

Когда я запускаю ViewController1, который печатает self.steps и self.dates, они не ноль. Согласитесь на разделение кода на классы. У меня просто есть привычка делать это таким образом, когда я пробую новые методы. – KML

+0

Извините, что вы правы, они были пустыми, дата была просто инициализирована сегодняшней датой NSDate(). Так почему же возврат пуст? Очевидно, что запрос не «пишет в return», а возвращает возвращает только инициализированные значения. Как я могу вернуть данные из запроса? – KML

ответ

1

Причина заключается в том, что HKSampleQuery обрабатывается асинхронно - она ​​возвращается сразу и не это работа в фоновом режиме , Таким образом, ваш метод заканчивается сразу же, вместо обработки ответа в блоке обработчика результатов. Вам нужно будет обновить свой метод, чтобы взять блок завершения вместо возвращаемых значений.

QueryHK.swift:

import UIKit 
import HealthKit 

struct Sample { 
    let step: Double 
    let date: NSDate 
} 

class QueryHK: NSObject { 

func performHKQuery(completion: (samples: [Sample]) -> Void) { 

    let healthKitManager = HealthKitManager.sharedInstance 
    let stepsSample = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 
    let stepsUnit = HKUnit.countUnit() 
    let sampleQuery = HKSampleQuery(
     sampleType: stepsSample, 
     predicate: nil, 
     limit: 0, 
     sortDescriptors: nil) 
     { 
      (sampleQuery, samples, error) in 

      var processedSamples = [Sample]() 
      for sample in samples as [HKQuantitySample] 
      { 
       processedSamples.append(Sample(step: sample.quantity.doubleValueForUnit(stepsUnit), date: sample.startDate)) 

       println("Query HealthKit steps: \(processedSamples.last?.step)") 
       println("Query HealthKit date: \(processedSamples.last?.date)") 
      } 
      // Call the completion handler with the results here 
      completion(samples: processedSamples) 
    } 
    healthKitManager.healthStore.executeQuery(sampleQuery) 
} 
} 

ViewController.swift:

import UIKit 

class ViewController: UIViewController { 

    var query = QueryHK() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     printStepsAndDate() 
    } 


    func printStepsAndDate() { 
     query.performHKQuery() { steps in 
      println(steps) 
     } 
    } 
} 
+0

Код дает 2 ошибки для обработчика завершения 1): '(@lvalue Double, @lvalue NSDate) -> $ T5' не идентично '(шаги: Double, date : NSDate) '. ошибка 2): используйте «я». чтобы сделать семантику захвата явным – KML

+0

@karlml my bad. Добавьте self, например: 'complete (self.steps, self.date)' –

+0

Я все еще получаю ошибку: '(@lvalue Double, @lvalue NSDate) -> $ T5' не идентичен '(шаги: Double, date: NSDate) и в функции ViewController query.performHKQuery() i get error: '(($ T4, ($ T4, $ T5) -> ($ T4, $ T5) -> $ T3) -> ($ T4 , ($ T4, $ T5) -> $ T3) -> $ T3, (($ T4, $ T5) -> ($ T4, $ T5) -> $ T3, $ T5) -> (($ T4, $ T5) -> $ T3, $ T5) -> $ T3) -> (($ T4, ($ T4, $ T5) -> $ T3) -> $ T3, (($ T4, $ T5) -> $ T3, $ T5) -> $ T3) -> $ T3 'не конвертируется в' (шаги: Double, date: NSDate) ' – KML

Смежные вопросы