UITableView reloadData无法正常工作

时间:2015-09-01 09:05:17

标签: ios iphone swift uitableview

我正在开发一个应用程序,我在循环中计算数据,对于每个循环,我想在tableview中发布新部分,显示计算结果。我正在向数组中添加结果并调用tableView.reloadData()。问题是,UI在每次循环后都没有更新,而是仅在循环的最后一个循环之后,一切都已完成。

一些注意事项:

  • 委托和dataSource正确连接,因为方法正常,只是不是我想要
  • 我也尝试将整个循环调度到异步块
  • 我尝试在异步块中单独调用reloadData()(很多人建议尝试此操作)
  • 我尝试了很多组合,包括函数beginUpdates, endUpdates, reload/insert sections/rows。你得到漂移。
  • 调用reloadData()时,始终会调用numberOfSections方法,但只在整个工作完成后才调用cellForRow
  • 对于单元格,我在tableView上使用具有UITableViewAutomaticDimension属性的自定义单元格。这可确保正确显示多行文本。我真的很想相信我对细胞的限制很好。

计算代码概述:

override func viewDidAppear(animated: Bool)  {

    for i in 0..<data.count {

        // Do computationally intensive work

        results[i].append(result) // multidimensional array
        Util.safeInc(&doneCounter) // made thread-safe just in case with objc_sync_enter
        resultTableView.reloadData()
    }
}

以下是tableView函数。我创建了一个可扩展的tableview。还有一些头函数,用于在节之间创建填充,以及选择功能。它们在这里似乎并不重要。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if expandedCells.contains(section) {
        return results[section].count + 1
    } else {
        return 1
    }

}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return doneCounter
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCellWithIdentifier("titleCell") as! electionNameTableViewCell
        cell.label.text = ...
        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("resultCell") as! resultTableViewCell
        // set texts for cell labels

        return cell
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您应该在主线程上调用resultTableView.reloadData(),如下所示:

dispatch_async(dispatch_get_main_queue) {
   resultTableView.reloadData()
}

答案 1 :(得分:0)

我最终使用自己的队列+将reloadData()调度到主队列。

override func viewDidAppear(animated: Bool)  {
    let backgroundQueue = dispatch_queue_create("com.example.workQueue", DISPATCH_QUEUE_SERIAL);
    for i in 0..<data.count {
        dispatch_async(backgroundQueue) {
            // Do computationally intensive work
            dispatch_async(dispatch_get_main_queue()) {
                resultTableView.reloadData()
            }
        }
    }
}