我正在开发一个应用程序,我在循环中计算数据,对于每个循环,我想在tableview中发布新部分,显示计算结果。我正在向数组中添加结果并调用tableView.reloadData()
。问题是,UI在每次循环后都没有更新,而是仅在循环的最后一个循环之后,一切都已完成。
一些注意事项:
reloadData()
(很多人建议尝试此操作)beginUpdates, endUpdates, reload/insert sections/rows
。你得到漂移。reloadData()
时,始终会调用numberOfSections方法,但只在整个工作完成后才调用cellForRow 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
}
}
有什么想法吗?
答案 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()
}
}
}
}