我有一个自定义WorkoutSessionManager.swift
,它不是WKInterfaceController
的子类。它有自己的上下文和协议。它包含查询和示例更新。所有心率,距离和能量数据(HKUnits)都打印到控制台。这个简单的块将数据输出到控制台。
guard let sample = activeEnergyBurnedSamples.first else{return}
let value = sample.quantity.doubleValueForUnit(self.energyUnit)
print(value)
我有一个单独的Dashboard.swift
与我的 mi , Cal , bpm 标签。
既然是实时数据,可以直接查询HK数据而不传递这个value
属性吗?
如果这不可能,我应该如何完成将value
发送到我在外部课程中的标签?
WorkoutSessionManager.swift
func createActiveEnergyStreamingQuery(workoutStartDate: NSDate) -> HKQuery? {
guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned) else {return nil}
let activeEnergyQuery = 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.addActiveEnergySamples(samples)
}
activeEnergyQuery.updateHandler = {(query, samples, deletedObjects, newAnchor, error) -> Void in
self.anchor = newAnchor!
self.addActiveEnergySamples(samples)
}
return activeEnergyQuery
}
func addActiveEnergySamples(samples: [HKSample]?) {
print("updating calorie samples")
guard let activeEnergyBurnedSamples = samples as? [HKQuantitySample] else { return }
dispatch_async(dispatch_get_main_queue()) {
self.currentActiveEnergyQuantity = self.currentActiveEnergyQuantity.addQuantitiesFromSamples(activeEnergyBurnedSamples, unit: self.energyUnit)
self.activeEnergySamples += activeEnergyBurnedSamples
self.delegate?.workoutSessionManager(self, didUpdateActiveEnergyQuantity: self.currentActiveEnergyQuantity)
// Checks
guard let sample = activeEnergyBurnedSamples.first else{return}
let value = sample.quantity.doubleValueForUnit(self.energyUnit)
print(value)
}
}
DashboardController.swift
@IBOutlet weak var milesLabel: WKInterfaceLabel!
@IBOutlet weak var caloriesLabel: WKInterfaceLabel!
@IBOutlet weak var bmpLabel: WKInterfaceLabel!
答案 0 :(得分:2)
如果我理解正确,您希望查询HealthKit商店中的某些样本,并在每次将新样本保存到商店时更新您的UI。
您可以通过多种方式执行此操作,包括使用delegation,closures或notifications。请参阅下面的使用委托的示例代码。
您已经在WorkoutSessionManager类中定义了一个WorkoutSessionManagerDelegate协议(显示为here)。如果该协议与WWDC 2015 Session 203中使用的协议相同,则会提供didUpdateActiveEnergyQuantity
,didUpdateDistanceQuantity
和didUpdateHeartRateSample
等方法。如果为WorkoutSessionManager提供充当委托的对象,则管理器可以使用委派协议提供的方法将UI管理委派给该对象。
在主要类WorkoutSessionManager中,定义一个属性以保存对委托的弱引用:weak var delegate: WorkoutSessionManagerDelegate?
然后,每当有新样本可用时,请调用相应的委托方法。因此,例如,在addActiveEnergySamples
函数中,您已经拥有以下行:self.delegate?.workoutSessionManager(self, didUpdateActiveEnergyQuantity: self.currentActiveEnergyQuantity)
在委托类DashboardController中,采用WorkoutSessionManagerDelegate协议:class DashboardController: WKInterfaceController, WorkoutSessionManagerDelegate
在awakeWithContext
中,将自己指定为经理的代表:wSM?.delegate = self
最后,在委托类中,实现委托协议提供的方法,并根据通过这些方法传递的数据,根据需要对UI进行此类更改。