在获取数据之前加载TableView

时间:2015-05-28 14:50:24

标签: ios uitableview swift

我使用从HealthKit检索数据的应用程序,然后将它们存储在数组中。我尝试做的是将tableViewController加载到该数组中的数据。但不幸的是,当我运行该应用程序时,该表显示为空。

为了更清楚,我有一个方法可以编码来检索所需数据的列表,如果用这些提取的数据填充一个数组(在类的顶部声明)。

我所做的是我在viewDidLoad函数中调用了这个函数,然后打印出数组但它是空的,所以我将方法的调用移到了函数viewDidAppear并打印出来数组。数组成功填充了数据,但我仍然遇到动态用这个数组的数据填充行的问题。它仍然显得空白。我理解的问题是在数组填充数据之前正在加载表视图。我通过调用方法self.tableView.reloadData()尝试了另一种解决方案,但没有运气。

有谁能请我解决这个问题?

更新:

以下是viewDidLoad功能:

override func viewDidLoad() {
    super.viewDidLoad()


    authorizeHealthKit()
    updateLastGlucoRecords()
    println("\(glucoReadings)")
    dispatch_async(dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }

}

这是viewDidAppear函数:

override func viewDidAppear(animated: Bool) {
    updateLastGlucoRecords()
    println("Hereeeee2:   \(glucoReadings)")
    dispatch_async(dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }
}

以下是数据动态加载表的位置:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let df = NSDateFormatter()
    let tf = NSDateFormatter()

    df.dateFormat = "yyyy-MM-dd"
    tf.dateFormat = "hh:mm:ss"

    let readingDateTime = dates[indexPath.row]

    let dateTabel = cell.viewWithTag(100) as! UILabel!
    let timeLabel = cell.viewWithTag(101) as! UILabel!
    let readingLabel = cell.viewWithTag(102) as! UILabel!
    let indicator = cell.viewWithTag(103) as UIView!


    dateTabel.text = df.stringFromDate(readingDateTime)
    timeLabel.text = tf.stringFromDate(readingDateTime)


    let reading = readings[indexPath.row]

    let doubleReading = getRecordDouble(reading)
    readingLabel.text = reading
    let sCase = recordCase(doubleReading!)
    switch (sCase) {
    case "Very low": indicator.backgroundColor = UIColor.redColor()
    case "Too low": indicator.backgroundColor = UIColor.orangeColor()
    case "Normal": indicator.backgroundColor = UIColor.greenColor()
    case "Too high": indicator.backgroundColor = UIColor.yellowColor()
    case "Very High": indicator.backgroundColor = UIColor.orangeColor()
    case "Danger": indicator.backgroundColor = UIColor.redColor()
    default: indicator.backgroundColor = UIColor.grayColor()
    }

    return cell
}

最后,这是从HealthKit检索数据的方法:

func updateLastGlucoRecords()
{
    // 1. Construct an HKSampleType for weight
    let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose)
    // 2. Call the method to read the most recent weight sample
    self.healthManager.readRecent10GlucoseReadings(sampleType, completion: {(allReadings, error) -> Void in
        println()
        if (error != nil) {
            println("Error reading glucose readings from HealthKit Store: \(error.localizedDescription)")
            return;
        }

        var glucoseLocalizedString = self.kUnknownString;
        self.glucoses = allReadings as? [HKQuantitySample]
        for reading in self.glucoses! {

            if let record = reading.quantity {
                glucoseLocalizedString = "\(record)"
                let dateTimeRecorded = reading.startDate
                self.glucoReadings.append(glucoseLocalizedString)
                self.glucoDates.append(dateTimeRecorded)
                println("Reading: \(self.glucoReadings), Date: \(self.glucoDates)")
            }
            dispatch_async(dispatch_get_main_queue(), { () -> Void in

            })
        }
    })
}

2 个答案:

答案 0 :(得分:2)

据推测,您在HealthKit中使用的查询包含完成处理程序。查询完成时调用此处理程序,这是您应该调用reloadData的地方。

由于HealthKit调用是异步的,因此您不能依赖于viewWillAppearviewDidLoad中填充的数组。

答案 1 :(得分:1)

尝试在填充数组后在主线程中调用self.tableView.reloadData()

dispatch_async(dispatch_get_main_queue()) {
      self.tableView.reloadData()
    }

不要忘记确保您的datasource方法得到正确实施。