是否可以直接从另一个类查询实时HKUnit数据而不传递数据?

时间:2016-08-11 23:33:33

标签: swift watchkit

我有一个自定义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发送到我在外部课程中的标签?

enter image description here enter image description here

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!

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望查询HealthKit商店中的某些样本,并在每次将新样本保存到商店时更新您的UI。

您可以通过多种方式执行此操作,包括使用delegationclosuresnotifications。请参阅下面的使用委托的示例代码。

您已经在WorkoutSessionManager类中定义了一个WorkoutSessionManagerDelegate协议(显示为here)。如果该协议与WWDC 2015 Session 203中使用的协议相同,则会提供didUpdateActiveEnergyQuantitydidUpdateDistanceQuantitydidUpdateHeartRateSample等方法。如果为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进行此类更改。