繁体   English   中英

使用健康数据填充UITableView吗?

[英]Populate UITableView with Health data?

我正在尝试使用Health应用程序中的数据填充tableview。 问题是每次我加载屏幕时,这些数据的顺序都不同。

我具有用于从“健康”应用程序获取数据的功能:

func readWalkrunDistance(startDate: NSDate) {
    healthManager.readRunningAndWalkingDistance(startDate, endDate: selectedDate!) { (results, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            var dict: [String: Double] = [String: Double]()
            dict["Walkrun Distance"] = results
            dict["number"] = 13
            if let result = results {
                self.walkrunDistance = result
            }
            self.healthData.append(dict)
            self.updateData()
        })
    }
}

func readBodyMass(startDate: NSDate) {
    healthManager.readMedianBodyMass(startDate, endDate: selectedDate!) { (results, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            var dict: [String: Double] = [String: Double]()
            dict["Body Mass"] = results
            dict["number"] = 7
            if let result = results {
                self.bodyMass = result
            }
            self.healthData.append(dict)
            self.updateData()
        })
    }
}

还有其他类似的10个功能可用于其他Health数据。 问题是数据每次都以不同的顺序出现,有时walkrunDistance会显示两次等等。我认为这是由于异步调用造成的,但是我不知道如何等待这些函数获取数据,然后再去到cellForRowAtIndexPath ...

这是我用于调用所有“运行状况”功能的功能:

func readAllData() {
    selectedDate = ProjectManager.sharedInstance.chosenDate
    selectedDate = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: 1, toDate: selectedDate, options: [])
    let startDate = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -1, toDate: selectedDate, options: [])
    self.readActiveEnergyBurned(startDate!)
    self.readBasalEnergyBurned(startDate!)
    self.readBloodAlcoholContent(startDate!)
    self.readBloodPressureDiastolic(startDate!)
    self.readBloodPressureSystolic(startDate!)
    self.readBodyFatPercentage(startDate!)
    self.readBodyMass(startDate!)
    self.readDistanceCycling(startDate!)
    self.readFlightsClimbed(startDate!)
    self.readAverageHeartRate(startDate!)
    self.readMinimumHeartRate(startDate!)
    self.readMaximumHeartRate(startDate!)
    self.readLeanBodyMass(startDate!)
    self.readStepCount(startDate!)
    self.readWorkouts(startDate!)
    self.tableView.reloadData()
}

我想先获取数据,然后以正确的方式将其加载到tableview中。

您可以尝试使用dispatch_group。

这里是教程的链接:

http://www.raywenderlich.com/79150/grand-central-dispatch-tutorial-swift-part-2

  • 只需将var group = dispatch_group_create()变量添加到您的类中即可。
  • dispatch_group_enter(group)添加到所有函数中,然后dispatch_group_leave(group)到异步调用的末尾。

    func readWalkrunDistance(startDate: NSDate) { healthManager.readRunningAndWalkingDistance(startDate, endDate: selectedDate!) { (results, error) -> Void in dispatch_group_enter(group) dispatch_async(dispatch_get_main_queue(), { () -> Void in var dict: [String: Double] = [String: Double]() dict["Walkrun Distance"] = results dict["number"] = 13 if let result = results { self.walkrunDistance = result } self.healthData.append(dict) self.updateData() dispatch_group_enter(group) }) } }

  • self.tableView.reloadData()之前添加self.tableView.reloadData() dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

这将解决您的“异步”问题。 -reloadData将在所有功能之后调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM