Swift 如何 dispatch_queue 更新表格视图单元格
Swift how to dispatch_queue to update tableview cell
我的应用程序需要在加载表格视图之前从服务器获取数据。
如何使用 dispatch_async 让应用程序在完成获取数据后更新单元格视图。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = myTable.dequeueReusableCellWithIdentifier("editCell") as! EditTableViewCell
cell.answerText.text = dictPicker[indexPath.row]![dictAnswer[indexPath.row]!]
cell.questionView.text = listQuestion1[indexPath.row]
cell.pickerDataSource = dictPicker[indexPath.row]!
dictAnswer[indexPath.row] = cell.pickerValue
cell.answerText.addTarget(self, action: #selector(AddFollowUpViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingDidEnd)
cell.answerText.tag = indexPath.row
cell.identifier = true
return cell
}
当我习惯上面的代码时,它给我一个错误:dictAnswer is nil。 dictAnswer 从服务器获取。我认为原因是在获取 dictAnswer 之前更新了单元格。但是我不知道如何使用dispatch_async。我希望有一些可以给我提示。谢谢
这就是您重新加载数据的方式。但是记得在你之前刷新你的数组
重新加载数据。请记住,仅仅获取数据并不重要,在重新加载之前将数据更新到数组中也很重要
dispatch_async(dispatch_get_main_queue(), {() -> Void in
self.tableView.reloadData()
})
您的 UITableViewDataSource 函数应该引用数组中的行数,就像这样
var data:[String]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
}
所以在你的异步函数中获取你可能会做的数据:
func loadData() {
// some code to get remote data
self.data = result
dispatch_async(dispatch_get_main_queue()) {
tableView.reloadData()
}
}
当您的数组为空时,(data.count 返回 0)tableView 不会尝试加载任何行并崩溃
Swift3+ 的更新:
DispatchQueue.main.async {
tableView.reloadData()
}
在使用 Scriptable 的答案后,我不得不进行一些更新,并认为 post 他们回到这里是个好主意...
Swift 3:
DispatchQueue.main.async(execute: { () -> Void in
self.tableView.reloadData()
})
和
DispatchQueue.main.async {
self.tableView.reloadData()
}
我的应用程序需要在加载表格视图之前从服务器获取数据。 如何使用 dispatch_async 让应用程序在完成获取数据后更新单元格视图。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = myTable.dequeueReusableCellWithIdentifier("editCell") as! EditTableViewCell
cell.answerText.text = dictPicker[indexPath.row]![dictAnswer[indexPath.row]!]
cell.questionView.text = listQuestion1[indexPath.row]
cell.pickerDataSource = dictPicker[indexPath.row]!
dictAnswer[indexPath.row] = cell.pickerValue
cell.answerText.addTarget(self, action: #selector(AddFollowUpViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingDidEnd)
cell.answerText.tag = indexPath.row
cell.identifier = true
return cell
}
当我习惯上面的代码时,它给我一个错误:dictAnswer is nil。 dictAnswer 从服务器获取。我认为原因是在获取 dictAnswer 之前更新了单元格。但是我不知道如何使用dispatch_async。我希望有一些可以给我提示。谢谢
这就是您重新加载数据的方式。但是记得在你之前刷新你的数组 重新加载数据。请记住,仅仅获取数据并不重要,在重新加载之前将数据更新到数组中也很重要
dispatch_async(dispatch_get_main_queue(), {() -> Void in
self.tableView.reloadData()
})
您的 UITableViewDataSource 函数应该引用数组中的行数,就像这样
var data:[String]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
}
所以在你的异步函数中获取你可能会做的数据:
func loadData() {
// some code to get remote data
self.data = result
dispatch_async(dispatch_get_main_queue()) {
tableView.reloadData()
}
}
当您的数组为空时,(data.count 返回 0)tableView 不会尝试加载任何行并崩溃
Swift3+ 的更新:
DispatchQueue.main.async {
tableView.reloadData()
}
在使用 Scriptable 的答案后,我不得不进行一些更新,并认为 post 他们回到这里是个好主意...
Swift 3:
DispatchQueue.main.async(execute: { () -> Void in
self.tableView.reloadData()
})
和
DispatchQueue.main.async {
self.tableView.reloadData()
}