【问题标题】:iOS HealthKit how to save Heart Rate (bpm) values? SwiftiOS HealthKit 如何保存心率(bpm)值?迅速
【发布时间】:2014-12-03 10:02:00
【问题描述】:

使用方法:HKUnit

样本类型 单位类型 单位名称 单位字符串 心率计数/时间每分钟跳动次数“计数/分钟”

【问题讨论】:

    标签: ios swift rate healthkit


    【解决方案1】:

    Swift : 将心率 (bpm) 保存到 healthkit 商店中

     private func saveHeartRateIntoHealthStore(height:Double) -> Void
        {
            // Save the user's heart rate into HealthKit.
            let heartRateUnit: HKUnit = HKUnit.countUnit().unitDividedByUnit(HKUnit.minuteUnit())
            let heartRateQuantity: HKQuantity = HKQuantity(unit: heartRateUnit, doubleValue: height)
    
            var heartRate : HKQuantityType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
            let nowDate: NSDate = NSDate()
    
            let heartRateSample: HKQuantitySample = HKQuantitySample(type: heartRate
                , quantity: heartRateQuantity, startDate: nowDate, endDate: nowDate)
    
            let completion: ((Bool, NSError!) -> Void) = {
                (success, error) -> Void in
    
                if !success {
                    println("An error occured saving the Heart Rate sample \(heartRateSample). In your app, try to handle this gracefully. The error was: \(error).")
    
                    abort()
                }
    
            }
    
            self.healthStore!.saveObject(heartRateSample, withCompletion: completion)
    
        }// end saveHeartRateIntoHealthStore
    

    【讨论】:

    • 你也可以为单元使用便利初始化器:let heartRateUnit = HKUnit(fromString: "count/min")
    【解决方案2】:

    Swift 3 中:

    func saveHeartRate(date: Date = Date(), heartRate heartRateValue: Double, completion completionBlock: @escaping (Bool, Error?) -> Void) {
        let unit = HKUnit.count().unitDivided(by: HKUnit.minute())
        let quantity = HKQuantity(unit: unit, doubleValue: heartRateValue)
        let type = HKQuantityType.quantityType(forIdentifier: .heartRate)!
    
        let heartRateSample = HKQuantitySample(type: type, quantity: quantity, start: date, end: date)
    
        self.healthKitStore.save(heartRateSample) { (success, error) -> Void in
            if !success {
                print("An error occured saving the HR sample \(heartRateSample). In your app, try to handle this gracefully. The error was: \(error).")
            }
            completionBlock(success, error)
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 ObjectiveC 中(对于那些不使用 Swift 的人,为了便于阅读而展开):

      #define nilable __nullable
      #define kCountPerMinUnitStr @"count/min"
      
      typedef void (^VoidBoolErrorBlock) (BOOL        success,
                                          NSError *   nilable error);
      
      enum {
          // Memory Constants
          kNil       = 0,
          kNilUPP    = 0,
          kNilRefCon = 0
      };
      
      
      /**
       writes a weight sample to HealthKit
      
       @param weight as HKQuantityTypeIdentifierBodyMass
       */
      - (void) writeCDAHeartRateSample: ( NSStringPtr ) valueStr
                              cdaUnits: ( NSStringPtr ) cdaUnits
                                  date: ( NSDate * ) date {      // was (CGFloat)
          double  theValue = kNil;
      
          // Each quantity consists of a value and a unit.
          HKUnit *            theMeasurementUnit = nil;
          HKQuantity *        theQuantity        = nil;
      
          HKQuantityType *    theHeartRateType   = nil;
          NSDate *            theDate            = nil;
      
          // For every sample, we need a sample type, quantity and a date.
          HKQuantitySample *  theSample = nil;
          VoidBoolErrorBlock  theBlock  = nil;
      
          theValue           = [ valueStr integerValue ];
      //    theMeasurementUnit = [ HKUnit unitFromCDAString: cdaUnits ];
          theMeasurementUnit = [ HKUnit unitFromString: kCountPerMinUnitStr ];    /// FIXME: temp code StackOverflow example
          theQuantity        = [ HKQuantity quantityWithUnit: theMeasurementUnit
                                                 doubleValue: theValue ];
      
          theHeartRateType = [ HKQuantityType quantityTypeForIdentifier: HKQuantityTypeIdentifierHeartRate ];
          theDate          = ( date != nil ) ? date : [ NSDate date ];///???: default to today's date?
      
          theBlock = [ self saveCDAHeartRateObjectBlock: theValue ];
      
          // For every sample, we need a sample type, quantity and a date.
          theSample = [HKQuantitySample quantitySampleWithType: theHeartRateType
                                                            quantity: theQuantity
                                                           startDate: theDate
                                                             endDate: theDate];
          [ self.healthStore saveObject: theSample
                         withCompletion: theBlock ];
      }
      
      
      
      /**
       companion block encapsulation for writeCDAHeartRateSample{}
      
       @return  completion block for saveObject: withCompletion in writeCDAHeartRateSample{}
       */
      - ( VoidBoolErrorBlock ) saveCDAHeartRateObjectBlock: ( double ) value {
          VoidBoolErrorBlock theResult = nil;
      
          theResult = ^(BOOL success, NSError *error) {
              if (!success) {
                  ///NSLog(@"Error while saving Heart Rate (%f) to Health Store: %@.", value, error);
              }
          };
      
          return theResult;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多