[英]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.