Swift如何dispatch_queue来更新tableview单元格

Jan*_*han 3 dispatch-async swift

我的应用程序需要在加载tableview之前从服务器获取数据.如何使用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
}
Run Code Online (Sandbox Code Playgroud)

当我习惯上面的代码,它给我一个错误:dictAnswer是零.dictAnswer从服务器获取.我认为原因是在dictAnswer获取之前更新了单元格.但我不知道如何使用dispatch_async.我希望有一些可以给我一个暗示.谢谢

Scr*_*ble 7

你的UITableViewDataSource函数应该引用数组中的行数,就像这样

var data:[String]()

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    }
Run Code Online (Sandbox Code Playgroud)

所以在你的异步函数中获取你可能做的数据:

func loadData() {
     // some code to get remote data
     self.data = result
     dispatch_async(dispatch_get_main_queue()) {
         tableView.reloadData()
     }
}
Run Code Online (Sandbox Code Playgroud)

当你的数组为空时,(data.count返回0)tableView不会尝试加载任何行并崩溃

Swift 3+更新:

DispatchQueue.main.async {
    tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)


Aks*_*kur 5

这就是重新加载数据的方式。但请记住在重新加载数据之前刷新数组。请记住,仅获取数据并不重要,在重新加载之前将数据更新到数组中也很重要

dispatch_async(dispatch_get_main_queue(), {() -> Void in
            self.tableView.reloadData()
        })
Run Code Online (Sandbox Code Playgroud)