2017-01-24 3 views
0

iIm пытается удалить элемент из Firebase, и у меня возникает странная проблема. Вот функция:Удаление неверного идентификатора на Firebase

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     //delete item from array 
     itemArray.remove(at: indexPath.row) 

     // delete from database 
     var itemRef = FIRDatabaseReference() 
     ref = FIRDatabase.database().reference() 
     let userID = FIRAuth.auth()?.currentUser?.uid 

     let idDel = itemArray[indexPath.row].itemID 
     itemRef = self.ref.child(userID!).child("ShoppingCart").child(idDel!) 
     itemRef.removeValue() 

     //delete row 
     cartTable.deleteRows(at:[indexPath], with: .fade) 


    } 

} 

Проблема заключается в том, что каждый раз, когда я удалить элемент следующий будет удален в Firebase, не один я выбрал. Когда я добираюсь до конца массива, я получаю ошибку «index out the range». Я предполагаю, что это связано с позициями indexpath/array?

Заранее благодарен!

+0

Можете ли вы выйти на indexPath на каждом этапе, чтобы увидеть, где это происходит не так? – brandonscript

ответ

1

Похоже, что вы удаляете элемент из массива, прежде чем получаете идентификатор, который вы сообщаете Firebase для удаления. Поэтому для каждого элемента вы фактически получите идентификатор следующего элемента в массиве, когда массив будет повторно проиндексирован после удаления. Если вы попробовали это с последним элементом, вы бы удалили последний элемент, массив изменился бы до размера n - 1, а затем вы попытались бы прочитать местоположение n, что приведет к ошибке за пределами диапазона.

Попробуйте удалить элемент из массива после получения идентификатора для удаления Firebase.

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
if editingStyle == .delete { 

    // delete from database 
    var itemRef = FIRDatabaseReference() 
    ref = FIRDatabase.database().reference() 
    let userID = FIRAuth.auth()?.currentUser?.uid 

    let idDel = itemArray[indexPath.row].itemID 
    itemRef = self.ref.child(userID!).child("ShoppingCart").child(idDel!) 
    itemRef.removeValue() 

    //delete item from array 
    itemArray.remove(at: indexPath.row) 

    //delete row 
    cartTable.deleteRows(at:[indexPath], with: .fade) 


    } 

} 
Смежные вопросы