Получить последнюю (самую последнюю) ценность шага от HealthKit (HKStatistics) - PullRequest
0 голосов
/ 19 октября 2018

Я хочу получить самое последнее (также известное) значение записи приложения Health (Kit).Например, значение шага из последней записи HKSource.

Я думал, что это будет работать с атрибутом HKStatisticsOptions.discreteMostRecent в построении запроса.

Текущий результат

Код работает нормально, без ошибок.Моя статистика имеет правильную дату начала и окончания (если доступно только одно значение, дата начала и окончания одинакова).

Проблема в том, что список statistics.sources всегда равен нулю, как и statistics.mostRecentQuantity()также ноль.

Все не связанные с HKSource операции суммирования sumQuantity() работают без проблем.

Другие сообщения Stackoverflow

Я бы попробовал эту идею сиспользуя запрос с пределом 1 и описанием сортировки из этого поста , но мне нужно также показать другие исторические значения в подробном представлении.Вот почему я подумал, что я мог бы запросить только один диапазон дат количества, использовать последний как мой «последний» и все остальные для моего представления таблицы истории.

Код

func requestMeasurements(completion: @escaping (HKStatistics?, AppError?) -> Void)
    {
        let healthStore = HKHealthStore()

        // Check if HK is available.
        guard HKHealthStore.isHealthDataAvailable() else
        {
            completion(nil, AppError.healthInformationNotAvailable)
            return
        }

        // Check if HK information is available
        guard let quantitiyType = HKQuantityType.quantityType(forIdentifier: .stepCount) else
        {
            completion(nil, AppError.requestedHealthDataTypeNotAvailable)
            return
        }

        let typeSet: Set = [quantitiyType]

        // Request user access to HK and especially this type
        healthStore.requestAuthorization(toShare: nil, read: typeSet)
        { success, error in

            // Ensure that the app has the required access
            if success == false
            {
                print(error?.localizedDescription ?? "<no error description>")
                completion(nil, AppError.noAccessToRequestedInformation)
                return
            }

            // Build query
            let now = Date()
            let lastSync = Calendar.current.startOfDay(for: now)
            let prediction = HKQuery.predicateForSamples(withStart: lastSync, end: now, options: .strictStartDate)

            let query = HKStatisticsQuery(quantityType: quantitiyType, quantitySamplePredicate: prediction, options: HKStatisticsOptions.discreteMostRecent)
            { _, statistics, error in
                // Check for error.
                if let _error = error
                {
                    print("An error occured: \(_error.localizedDescription)")
                    completion(nil, AppError.requestingFailed)
                    return
                }

                // Check if statistics are available.
                guard let _statistics = statistics else
                {
                    completion(nil, AppError.requestingFailed)
                    return
                }

                completion(_statistics, nil)
            }

            // Execure query
            healthStore.execute(query)
        }

1 Ответ

0 голосов
/ 19 октября 2018

Если вы хотите использовать только количества и т. Д. Просто используйте HKSampleQuery вместо HKStatisticsQuery.

После этого вам просто нужно преобразовать список результатов HKSample в [HKQuantitySample].

Теперь у вас есть дата начала и окончания, а также quantity.

...