Ios 是否使用运行状况数据填充UITableView?

Ios 是否使用运行状况数据填充UITableView?,ios,swift,uitableview,asynchronous,healthkit,Ios,Swift,Uitableview,Asynchronous,Healthkit,我正试图用健康应用程序中的数据填充我的tableview。问题是每次我加载屏幕时,这些数据的顺序都不同 我有从健康应用程序获取数据的功能: func readWalkrunDistance(startDate: NSDate) { healthManager.readRunningAndWalkingDistance(startDate, endDate: selectedDate!) { (results, error) -> Void in dispatch_a

我正试图用健康应用程序中的数据填充我的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个类似的函数用于其他健康数据。问题是数据每次都以不同的顺序出现,有时walkrunDistance会显示两次等等。我认为这是因为异步调用,但我不知道如何等待这些函数获取数据,然后转到CellForRowatineXpath

以下是调用所有运行状况函数的函数:

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\u group

以下是教程的链接:

  • 只需将
    var group=dispatch\u group\u create()
    变量添加到类中即可
  • dispatch\u group\u enter(group)
    添加到所有函数中,并将
    dispatch\u group\u leave(group)
    添加到异步调用的末尾

    func readWalkrunDistance(起始日期:NSDate){
    healthManager.readRunningAndWalkingDistance(开始日期,结束日期:selectedDate!){(结果,错误)->在中无效
    调度组输入(组)
    dispatch\u async(dispatch\u get\u main\u queue(),{()->Void in
    变量dict:[String:Double]=[String:Double]()
    dict[“步行距离”]=结果
    dict[“数字”]=13
    如果让结果=结果{
    self.walkrunDistance=结果
    }
    self.healthData.append(dict)
    self.updateData()
    调度组输入(组)
    })
    }
    }

  • 在self.tableView.reloadData()之前添加

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

是的,你是对的:)将
调度异步(dispatch\u get\u main\u queue(),{()->Void in
替换为
调度异步(dispatch\u get\u global\u queue(dispatch\u queue\u PRIORITY\u DEFAULT,0),{()->Void in