2017-07-27 4 views
0

donc j'ai une application avec des boutons radio pour cocher des tâches, tout fonctionne comme prévu tant que je laisse l'animation se terminer mais si j'appuie sur deux boutons en même temps fois que je reçois une erreur:Dispatch.main.asyncAfter() crash application quand il est appelé avant qu'il ne soit terminé

libc++abi.dylib: terminating with uncaught exception of type NSException

Le code exécuté chaque fois qu'un RadioButton est exploité

func RadioTapped(_ cell: TableViewCell) { 


    if let indexPath = tableView.indexPath(for: cell) { 
     // Removes task from coreData 
     let task = self.tasks[indexPath.row] 
     print(tasks.count) 
     self.context.delete(task) 
     print(tasks.count) 
     (UIApplication.shared.delegate as! AppDelegate).saveContext() 
     do{ 
      self.tasks = try self.context.fetch(TodayTask.fetchRequest()) 

      // Animates the removal of task cell 
      DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(800),execute: { 
       self.tableView.beginUpdates() 
       self.tableView.deleteRows(at: [indexPath], with: .fade) 
       self.tableView.endUpdates() 
      }) 

     } catch { 
      print("Fetching Failed") 
     } 
    } 


} 

message d'erreur

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (11) must be equal to the number of rows contained in that section before the update (13), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

+0

exécuter sur le simulateur pour obtenir le journal des erreurs .. –

+0

je l'ai couru sur le simulateur, mais où trouver le journal? –

+1

Vous devez montrer le message associé à l'exception, il vous dira ce qui s'est mal passé, mais je dirai que 'asyncAfter' est une odeur de code; vous ne devriez pas avoir besoin de délais – Paulw11

Répondre

0

L'opération de suppression de ligne de table nécessite également de supprimer l'élément du tableau de la table.

Selon votre code, self.tasks peut être un tableau pour votre liste de table.

Supprime un élément de 'self.tasks' des mêmes index, pour lesquels vous supprimez vos lignes.

Conseil:

// Remove array element 
self.tasks.remove(at: <index.row>) 


DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(800),execute: { 
       self.tableView.beginUpdates() 
       self.tableView.deleteRows(at: [indexPath], with: .fade) 
       self.tableView.endUpdates() 
      }) 
+1

Clairement écrit que 'self.context.delete (tâche)' et après cela 'self.tasks = essayer self.context.fetch (TodayTask.fetchRequest())' –

+0

Wont le self.context.delete (tâche) supprimer la tâche à indexPath? –

+0

@SalmanGhumsani D'accord avec vous. son ré-initier le tableau à partir du contexte. mais doivent assurer, non. des éléments du tableau exact avant l'opération de suppression – Krunal