Как читать данные о сердечном ритме HealthKit?

Я знаю, что эти вопросы задавались, но на самом деле не было ответа. Я пробовал вещи из таких потоков: Частота сердечных сокращений с Apple Healthkit

Я попытался преобразовать это из Objective-C в Swift, но не сработал.

Мой вопрос в том, как лучше всего считывать данные о частоте сердечных сокращений из аптечки. Я хочу иметь возможность читать каждое измерение частоты сердечных сокращений с момента их начала, и я хочу иметь возможность видеть отметки времени/дня указанных измерений.

Я попросил разрешения здесь:

import Foundation
import UIKit
import HealthKit

class HealthKitManager: NSObject {

static let healthKitStore = HKHealthStore()

static func authorizeHealthKit() {

    let healthKitTypes: Set = [
        HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!,
    ]

    healthKitStore.requestAuthorizationToShareTypes(healthKitTypes,
                                                    readTypes: healthKitTypes) { _, _ in }
    }
}

Вот мой код контроллера представления на данный момент (я не уверен, почему это не работает):

import UIKit
import HealthKit

class ViewController: UIViewController {

let health: HKHealthStore = HKHealthStore()
let heartRateUnit:HKUnit = HKUnit(fromString: "count/min")
let heartRateType:HKQuantityType   = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!
var heartRateQuery:HKQuery?


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

     @IBAction func authorizeTapped(sender: AnyObject) {
    print("button tapped")
    self.createStreamingQuery()
    HealthKitManager.authorizeHealthKit()

}


func createStreamingQuery() -> HKQuery
{
    let queryPredicate  = HKQuery.predicateForSamplesWithStartDate(NSDate(), endDate: nil, options: .None)

    let query:HKAnchoredObjectQuery = HKAnchoredObjectQuery(type: self.heartRateType, predicate: queryPredicate, anchor: nil, limit: Int(HKObjectQueryNoLimit))
    { (query:HKAnchoredObjectQuery, samples:[HKSample]?, deletedObjects:[HKDeletedObject]?, anchor:HKQueryAnchor?, error:NSError?) -> Void in

        if let errorFound:NSError = error
        {
            print("query error: \(errorFound.localizedDescription)")
        }
        else
        {
            //printing heart rate
            if let samples = samples as? [HKQuantitySample]
            {
                if let quantity = samples.last?.quantity
                {
                    print("\(quantity.doubleValueForUnit(self.heartRateUnit))")
                }
            }
        }
    }

    query.updateHandler =
        { (query:HKAnchoredObjectQuery, samples:[HKSample]?, deletedObjects:[HKDeletedObject]?, anchor:HKQueryAnchor?, error:NSError?) -> Void in

            if let errorFound:NSError = error
            {
                print("query-handler error : \(errorFound.localizedDescription)")
            }
            else
            {
                //printing heart rate
                if let samples = samples as? [HKQuantitySample]
                {
                    if let quantity = samples.last?.quantity
                    {
                        print("\(quantity.doubleValueForUnit(self.heartRateUnit))")
                    }
                }
            }//eo-non_error
    }//eo-query-handler

    return query
}


}

Я не могу ничего напечатать на консоли, чего я и хочу.

Кроме того, ни один из этих кодов не предназначен для домашних заданий, личных/профессиональных проектов... и т.д. Это просто для развлечения / обучения, и большая часть этого кода - это то, что я пробовал и что я нашел, просматривая несколько стеков над потоком и другие форумы.


person dnaland    schedule 14.05.2016    source источник
comment
Вы когда-нибудь выполняли свою функцию createStreamingQuery?   -  person jtbandes    schedule 14.05.2016
comment
Я сделал, и ничего не было напечатано на консоли, не знаю почему.   -  person dnaland    schedule 14.05.2016
comment
Вы использовали executeQuery в хранилище здоровья?   -  person jtbandes    schedule 14.05.2016
comment
Я получаю '‹HKAnchoredObjectQuery: 0x12ce278c0›' распечатанный сейчас   -  person dnaland    schedule 14.05.2016
comment
Вы создали запрос, но не поделились кодом, свидетельствующим о том, что вы действительно запустили запрос.   -  person jtbandes    schedule 14.05.2016
comment
У меня есть кнопка авторизации в моем представлении, и я изменил код, так что теперь он: '‹HKAnchoredObjectQuery: 0x12ce278c0›   -  person dnaland    schedule 14.05.2016


Ответы (1)


Вам нужно фактически выполнить ваш запрос.

let query = self.createStreamingQuery()
self.health.executeQuery(query)
person Pranav Wadhwa    schedule 14.05.2016
comment
Благодарю вас! Еще одна вещь, теперь адрес памяти печатается, как я могу изменить это на читаемые данные? - person dnaland; 14.05.2016
comment
@dnaland извините, я не понял, что вы сказали. Не могли бы вы уточнить? - person Pranav Wadhwa; 14.05.2016
comment
Когда я пытаюсь запустить код, в консоль выводится следующее: ‹HKAnchoredObjectQuery: 0x141209650› ‹HKAnchoredObjectQuery: 0x141209bf0› ‹HKAnchoredObjectQuery: 0x141209e60› ‹HKAnchoredObjectQuery: 0x14111db00› предупреждение: не удалось загрузить какую-либо информацию о классе Objective-C. Это значительно снизит качество доступной информации о типах. Как я могу преобразовать ‹HKAnchoredObjectQuery...› в данные для чтения? - person dnaland; 14.05.2016
comment
@dnaland попробуйте вызвать .description для всего, что вы печатаете. - person ShayanK; 19.08.2016