2016-10-06 53 views
1

UPDATE:如何從一個UITableView刪除行編程和更新UI

我發現它在更新前UITableView了長達10秒的原因。它與我發送給我的服務器的HTTP POST請求有關。下面是我閱讀所有答案和在線搜索後的代碼。原因是要放置變量index,indexPath和呼叫self.tableView(tableView: UITableView UITableView, commit: UITableViewCellEditingStyle, forRowAt: IndexPath)

如果我將它們移動到task閉包之外,它們立即執行,但我不希望它們在外面,因爲在刪除之前我需要從服務器上「確定」。

問題不在服務器響應時間,因爲我立即得到響應。我認爲這與我不太熟悉的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)&note=\(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

你在做主線程嗎? – JackRobinson

+0

即使使用tableview.ReloadData()之後? –

+0

您需要將'self.tableView.reloadData()'添加到您的代碼中 –

回答

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() 
+0

我試過後移動它,但是就像上面Lion的回答一樣,它非常慢(在單元更新之前大約5秒) – Frederik

+0

重新加載整個表格視圖比調用delete方法更加昂貴。嘗試更新主線程上的表格視圖。我更新了答案。 – vadian

+0

如何將呼叫轉移到'saveExpenses'有什麼區別? – rmaddy