4 votes

Xamarin.Forms Observablecollection lève une exception sur un appareil ios

Dans le modèle de vue, j'ai une observablecollection qui sera créée dans le constructeur. Dans la méthode, j'appelle la RefreshCommand, qui effectue les étapes suivantes :

  • Efface la liste existante (Items.Clear())
  • Appelle un webservice pour recevoir les nouveaux éléments (async)
  • utilise foreach pour ajouter tous les nouveaux Itms à la liste

Ces éléments seront affichés dans un ListView et cela fonctionne très bien pour Android (simulateur et appareil réel) et aussi pour le simulateur iOS, mais dès que je le déploie sur un appareil iOS réel (dans ce cas l'iPhone 6), l'application se plante

Voici une partie de l'exception :

"Exception Objective-C déclenchée. Nom : NSInternalInconsistencyException Motif : Mise à jour non valide : nombre d'éléments non valide dans la section 0. Le nombre d'éléments contenus dans une section existante après la mise à jour (1) doit être égal au nombre d'éléments contenus dans cette section avant la mise à jour (1), plus ou moins le nombre d'éléments insérés ou supprimés de cette section (1 inséré, 0 supprimé) et plus ou moins le nombre d'éléments déplacés dans ou hors de cette section (0 déplacé dans, 0 déplacé hors). "

J'ai déjà essayé de déplacer l'action clear et fill dans le GUIThread et je l'ai aussi essayé avec une collection thread safe : https://codetraveler.io/2019/09/11/using-observablecollection-in-a-multi-threaded-xamarin-forms-application/

mais l'application plante encore et encore... La solution de contournement qui fonctionne pour moi est de changer l'observablecollection en une liste normale...

Une idée de la raison pour laquelle cela ne se produit que sur un appareil réel ?

0 votes

Je pense que la méthode Clear peut causer un problème lorsqu'elle nettoie la collection.

0 votes

Oui, c'est la méthode de l'effacement qui pose problème, mais je dois nettoyer la liste avant d'ajouter de nouveaux éléments.

0 votes

Lorsque vous utilisez la fonction Clear efface l'ensemble de la collection tout en notifiant le changement de collection, ce qui provoque le problème ci-dessus. La solution est simplement d'assigner un nouvel objet avec la liste des éléments corrects !

2voto

iSpain17 Points 781

J'ai eu des erreurs similaires, ce qui a résolu le problème pour moi est de réassigner une nouvelle ObservableCollection à la variable liée, au lieu de les effacer et de les ajouter une par une. J'ai donc créé une liste des éléments à inclure dans l'observableCollection, puis je les ai assignés de la manière suivante :

boundVar = new ObservableCollection(list);

1voto

jfmg Points 1204

Bien sûr, vous pouvez simplement créer une nouvelle collection observable en tapant MyCollection = new ObservableCollection(list); . Cependant, cela entraîne souvent un clignotement de l'interface utilisateur et, comme cela a déjà été mentionné dans un commentaire : Pourquoi utiliser une ObservableCollection si nous en définissons toujours une nouvelle ?

Une autre solution qui fonctionne pour moi est d'utiliser le SourceCache ou le SourceList de la bibliothèque DynamicData : https://github.com/reactiveui/DynamicData

Avec DynamicData, vous ne travaillez jamais directement sur la collection observable. Il en résulte une liste très performante où vous pouvez ajouter, supprimer ou effacer autant que vous le souhaitez sans jamais obtenir d'exception non rattrapable sur iOS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X