2016-08-02 11 views
10

WWDC 2015 - Session 203 tabanlı bir HealthKit/WatchKit uygulaması oluşturma.HealthKit'te "AddQuantitiesFromSamples" nasıl eklenir?

Hiçbir kaynak kodu yok, bu yüzden anında yazıyorum. Tartışmamakta zorlandığım bir yöntem var.

Neyse ki, egzersiz seansına örnek miktarları ekleyen tüm egzersiz türleri için aynı addQuantitiesFromSamples yöntemidir.

Tabii ki kodumda bu yöntem bulunmadığından bu hatayı yaşıyorum. type 'HKQuantity' arasında

Değer sahip hiçbir üye 'addQuantitiesFromSamples'

Ben örnek miktarları ekleyen bir yöntem yazmak nasıl emin değilim. Yöntem, göreceli olarak basit olmalıdır, çünkü projedeki örnek sorguların üçünde de kullanılmaktadır.

Gizem addQuantitiesFromSamples yönteminin çağrıldığı sumDistanceSamples işlevi iştir.

Bu, aynı hatayı içeren üç bloktan biridir, bu yüzden bunlardan biri için bir çözüm bulmam gerekiyor.

WorkoutSessionManager.swift

class WorkoutSessionManager: NSObject, HKWorkoutSessionDelegate { 

var activeEnergySamples: [HKQuantitySample] = [] 
var distanceSamples: [HKQuantitySample] = [] 
var heartRateSamples: [HKQuantitySample] = [] 

// ... code 

var distanceType: HKQuantityType { 
    if self.workoutSession.activityType == .Cycling { 
     return HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceCycling)! 
    } else { 
     return HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)! 
    } 
} 

var currentActiveEnergyQuantity: HKQuantity 
var currentDistanceQuantity: HKQuantity 
var currentHeartRateSample: HKQuantitySample? 

// ... code 


// MARK: Data queries 

// Create streaming query helper method. 
func createStreamingDistanceQuery(workoutStartDate: NSDate) -> HKQuery? { 
    guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning) else {return nil} 

    // Instantiate a HKAnchoredObjectQuery object with a results handler. 
    let distanceQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, samples, deletedObjects, newAnchor, error) -> Void in 
     guard let newAnchor = newAnchor else {return} 
     self.anchor = newAnchor 
     self.sumDistanceSamples(samples) 
    } 

    // Results handler that calls sumDistanceSamples function. 
    distanceQuery.updateHandler = {(query, samples, deletedObjects, newAnchor, error) -> Void in 
     self.anchor = newAnchor! 
     self.sumDistanceSamples(samples) 
    } 

    return distanceQuery 
} 

func sumDistanceSamples(samples: [HKSample]?) { 
    guard let currentDistanceSamples = samples as? [HKQuantitySample] else { return } 

    dispatch_async(dispatch_get_main_queue()) { 

     // Error point - "no member 'addQuantitiesFromSamples'" 
     self.currentDistanceQuantity = self.currentDistanceQuantity.addQuantitiesFromSamples(currentDistanceSamples, unit: self.distanceUnit) 

     // Add sample to array of samples accumulated over the workout. 
     self.distanceSamples += currentDistanceSamples 

     self.delegate?.workoutSessionManager(self, didUpdateDistanceQuantity: self.currentDistanceQuantity) 

    } 
} 

// MARK: HEART RATE STREAMING 
func createHearRateStreamingQuery(workoutStartDate: NSDate) -> HKQuery? { 

    // alternative method to creating a match samples predicate 

    // Append the new quantities with the current heart rate quantity. 
    guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else {return nil} 

    // Instantiate a HKAnchoredObjectQuery object with a results handler that calls our sumHeartRateSamples function 
    let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, samples, deletedObjectts, newAnchor, error) -> Void in 
     guard let newAnchor = newAnchor else {return} 
     self.anchor = newAnchor 
     self.updateHeartRateSamples(samples) 
    } 

    // Results handler that calls our addActiveEnergySamples function 
    heartRateQuery.updateHandler = {(query, samples, deletedObjects, newAnchor, error) -> Void in 
     self.anchor = newAnchor! 
     self.updateHeartRateSamples(samples) 
    } 

    return heartRateQuery 
} 

func updateHeartRateSamples(samples: [HKSample]?) { 
    guard let heartRateCountSamples = samples as? [HKQuantitySample] else { return } 

    // updateHeartRateSamples method dispatches back to the main queue. 
    dispatch_async(dispatch_get_main_queue()) { 

     // Error: Value of type 'HKQuantitySample?' has no member 'addQuantitiesFromSamples 
     self.currentHeartRateSample = self.currentHeartRateSample.addQuantitiesFromSamples(heartRateCountSamples, unit: self.countPerMinuteUnit) 

     // appends/updates that sample to an array of samples accumulated over the workout. 
     self.heartRateSamples += heartRateCountSamples 

     self.delegate?.workoutSessionManager(self, didUpdateHeartRateSample: self.currentHeartRateSample!) 
    } 

} 

cevap

6

bu aradığınız budur, ancak bu aynı WWDC videoyu izledi başkasından Eksik yöntem olarak görünmektedir olmadığından emin değilim:

extension HKQuantity { 
    func addQuantitiesFromSamples(samples : [HKQuantitySample], unit: HKUnit) -> HKQuantity { 

     var currentValue = doubleValueForUnit(unit) 

     for sample in samples { 
      let value = sample.quantity.doubleValueForUnit(unit) 
      currentValue += value 
     } 
     let result = HKQuantity(unit: unit, doubleValue: currentValue) 
     return result 
    } 
} 

Kaynak: Calories and Distance data from query

+0

komik. Açıkçası, her yerde arama yaptığım için iş parçacığı buldum. Ama uzantının işe yarayacağını bilmiyordum. Denememe izin ver ve sana geri döneyim. Teşekkürler. – tymac

+0

@tymac, Swift dosyanızın sonuna yerleştirerek sınıf dışında çalışmalı. Sınıfınız özel mi yoksa dahili mi? Uzantıyı kamuya açmayı denediniz mi? Uygulamanızda birden çok modül kullanıyor musunuz? – JAL

+0

Oh bekle bir saniye! Sanırım şimdi anlıyorum. 3 toplama bloğundan 2 tanesi iyi görünüyor. "AddDistanceSamples" yöntemi ve "addActiveEnergySamples" yöntemi uzantıyı kabul ediyor gibi görünüyor. Ancak kalp atış hızı toplaması, kalp atış hızının toplamı olmadığı için uzatmayı sevmez. Sadece güncellemeleri doğru mu? Kalp atış hızı için ayrı bir yöntem oluşturmak için aynı uzantıyı kopyalayabilir miyim? UpdateHeartRateSamples' ile nasıl çalışırım? – tymac