更新
我在更新UITableView
之前发现了最多需要10秒的原因。它与我发送到服务器的HTTP POST请求有关。在阅读完所有答案并在线搜索之后,下面是我的代码。原因是放置变量index
,indexPath
以及对self.tableView(tableView: UITableView UITableView, commit: UITableViewCellEditingStyle, forRowAt: IndexPath)
的调用。
如果我将它们移到task
关闭之外,它们会立即执行,但我不希望它们在外面,因为我需要" OK"删除之前从服务器。
问题不在于服务器响应时间,因为我立即收到响应。我认为它与我不熟悉的task.resume()
有关。
foreach expense in expenses {
var request = URLRequest(url: URL(string: Constants.ZEBON_SERVER_URL)!)
request.httpMethod = "POST"
let postString = "date=\(expense.date)&amount=\(expense.amount)¬e=\(expense.desc)"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) {
(data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
print("error = \(error)")
}
// If the server responds with "OK" (the request was received) then delete the expense
if responseString?.range(of:"return\":\"ok") != nil {
let index = self.expenses.index(of: expense)
let indexPath = IndexPath(row: index!, section: 0)
// Deletes the expense
self.tableView(self.tableView, commit: .delete, forRowAt: indexPath)
}
else {
// TODO: Implement error handling.
}
}
task.resume()
}
原始问题:
我有一些显示在UITableView
中的对象。当我按下按钮时,它们会被发送到服务器,应该从tableView中删除。
我目前的代码如下:
let index = self.expenses.index(of: expense)
let indexPath = NSIndexPath(row: index!, section: 0)
self.expenses.remove(at: indexPath.row)
// Saves the array 'Expenses' to persistent storage.
self.saveExpenses()
self.tableView.beginUpdates()
self.tableView.deleteRows(at: [indexPath as IndexPath], with: .none)
self.tableView.endUpdates()
我的问题是费用已发送到服务器并从存储中删除,但UITableView
没有刷新,因此当我无法以任何方式与其进行交互时,单元格保持可见。
答案 0 :(得分:1)
在更新UI后保存数组。
实际上这些行是足够的,begin/endUpdates()
对单个删除操作没有影响。
let index = self.expenses.index(of: expense)
let indexPath = IndexPath(row: index!, section: 0)
self.expenses.remove(at: index!)
DispatchQueue.main.async {
self.tableView.deleteRows(at: [indexPath], with: .none)
}
// Saves the array 'Expenses' to persistent storage.
self.saveExpenses()