2016-10-06 16 views
1

UPDATE更新しない:私はそれがUITableViewを更新する前に10秒かかった理由を発見したは、どのように私は、プログラムのUITableViewから行を削除し、UI

を。それは私のサーバーに送信しているHTTP POST要求と関係があります。以下は私のコードです。すべての答えを読んだり、オンラインで検索したりしています。理由は、変数index,indexPathself.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)&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の更新後に配列を保存します。

実際には、これらの行で十分です。は、1回の削除操作で効果がありません。

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

私はそれを移動しようとしましたが、上のライオンの答えと同じように非常に遅いです(セルアップデートの約5秒前) – Frederik

+0

テーブルビュー全体をリロードすると、deleteメソッドを呼び出すよりも高価になります。メインスレッドのテーブルビューを更新しようとします。私は答えを更新しました。 – vadian

+0

'saveExpenses'への呼び出しをどのように変更すればよいですか? – rmaddy

関連する問題