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!)
}
}
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
@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
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