2016-08-11 1 views
0

У меня есть обычай WorkoutSessionManager.swift, который не является подклассом WKInterfaceController. Он имеет свой собственный контекст и протокол. Он содержит запрос и выборочные обновления. Все данные о частоте сердечных сокращений, расстоянии и энергии (HKUnits) печатаются на консоли. Этот простой блок выводит данные на консоль.Возможно ли запрашивать данные Live HKUnit непосредственно из другого класса без передачи данных?

guard let sample = activeEnergyBurnedSamples.first else{return} 
     let value = sample.quantity.doubleValueForUnit(self.energyUnit) 
     print(value) 

У меня есть отдельный Dashboard.swift с моим ми, Cal, ВРМ этикеток.

Поскольку данные в реальном времени можно напрямую запросить данные 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! 

ответ

2

Если я правильно понимаю, вы хотите запросить магазин HealthKit для определенных видов образцов, и обновляйте свой пользовательский интерфейс каждый раз, когда новые образцы сохраняются в хранилище.

Вы можете сделать это несколькими способами, в том числе используя delegation, closures, или notifications. См. Ниже пример кода с помощью делегирования.

Вы уже определили протокол WorkoutSessionManagerDelegate в своем классе WorkoutSessionManager (показано here). Если этот протокол такой же, как тот, который используется в WWDC 2015 Session 203, он предоставляет такие методы, как didUpdateActiveEnergyQuantity, didUpdateDistanceQuantity и didUpdateHeartRateSample. Если вы предоставите WorkoutSessionManager объект, который действует как делегат, менеджер может делегировать управление пользовательским интерфейсом этому объекту, используя методы, предоставленные протоколом делегирования.

В главном классе, WorkoutSessionManager, определить свойство удерживать слабую ссылку на делегат: weak var delegate: WorkoutSessionManagerDelegate?

Затем, когда новые образцы становятся доступными, вызовите соответствующий метод делегата. Так, например, в функции addActiveEnergySamples, у вас уже есть следующая строка: self.delegate?.workoutSessionManager(self, didUpdateActiveEnergyQuantity: self.currentActiveEnergyQuantity)

В классе делегата DashboardController, принять протокол WorkoutSessionManagerDelegate: class DashboardController: WKInterfaceController, WorkoutSessionManagerDelegate

И в awakeWithContext, назначить себя в качестве делегата менеджера: wSM?.delegate = self

Наконец, в классе делегатов реализуйте методы, предоставляемые протоколом делегирования, и при необходимости внесите такие изменения в свой интерфейс на основе данных, переданных этими методами.

 Смежные вопросы

  • Нет связанных вопросов^_^