2015-07-21 1 views
0

У меня есть функция, которая принимает общее количество шагов, записанных устройством, сохраняет его в переменной и затем получает данные шага с каждого дня, добавляя их к другой переменной, пока они не будут такое же значение. Мне нужно это, чтобы приложение узнало, когда остановиться, когда он сохраняет данные временного шага в массив.Step Count Функция пропущенных строк Swift

Однако вторая половина этой функции не выполняется, и я понятия не имею, почему. Вот функция:

// allTimeStepTotal and allTimeStepSum are doubles that are defined with a value of 0.0 
func stepsAllTime(completion: (Double, NSError?) ->()) { 

    // The type of data we are requesting 
    let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 

    // Our search predicate which will fetch data from now until a day ago 
    let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate.distantPast() as! NSDate, endDate: NSDate(), options: .None) 

    // The actual HealthKit Query which will fetch all of the steps and sub them up for us. 
    let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in 
     var steps: Double = 0 
     if results?.count > 0 { 
      for result in results as! [HKQuantitySample] { 
       steps += result.quantity.doubleValueForUnit(HKUnit.countUnit()) 
      } 
     } 
     completion(steps, error) 
     self.allTimeStepsTotal += steps 
     println("Total:") 
     println(self.allTimeStepsTotal) 
     println("Sum:") 
     println(self.allTimeStepsSum) 
    } 

    self.healthKitStore.executeQuery(query) 

    println("Moving On") 
    var x = 1 

    while self.allTimeStepsTotal > self.allTimeStepsSum { 
     x += -1 
     // The type of data we are requesting 
     let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 
     var daysAgo = -1 * x 
     var daysSince = (-1 * x) + 1 

     // Our search predicate which will fetch data from now until a day ago 
     let samplePredicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: daysAgo, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: daysSince, toDate: NSDate(), options: nil), options: .None) 

     // The actual HealthKit Query which will fetch all of the steps and sub them up for us. 
     let stepQuery = HKSampleQuery(sampleType: sampleType, predicate: samplePredicate, limit: 0, sortDescriptors: nil) { query, results, error in 
     var steps: Double = 0 

     if results?.count > 0 { 
      for result in results as! [HKQuantitySample] { 
       steps += result.quantity.doubleValueForUnit(HKUnit.countUnit()) 
      } 
     } 
     completion(steps, error) 
     self.allTimeStepsSum += steps 
     println("New Sum:") 
     println(self.allTimeStepsSum) 
    } 

    self.healthKitStore.executeQuery(stepQuery)  
} 

И вот звонок:

healthManager.stepsAllTime({Double, NSError in 
     println("All Done") 
    }) 
    println("Finished executing stepsAllTime") 

Может кто-нибудь сказать мне, что мне нужно исправить, или что пошло не так?

+0

Это, как говорится, вы знаете, как это исправить? Этот вопрос полностью меня озадачил. – ButtonMasterBot

ответ

1

Предполагая, что allTimeStepsTotal и allTimeStepsSum инициализируются 0.0, вторая половина этой функции не будет выполнять, потому что HKSampleQuery вы создали выполняется асинхронно-то есть, он вызывает resultHandler в какой-то момент в будущем после того, как while цикл во второй половине вашей функции. Условие self.allTimeStepsTotal > self.allTimeStepsSum будет оценивать значение false, поскольку оба значения по-прежнему 0.0, и цикл не будет выполняться.

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

  • Нет связанных вопросов^_^