0
votes

pourquoi les données de tableview sont toujours triées aléatoirement?

ici est pertinent pour ma partie question de mon code et cela fonctionne presque bien, sauf une chose. Les données sont toujours triées de manière aléatoire. À propos du code: je devrais recevoir des données (nom de CoffeeShop et .jpg) de Firebase et afficher la photo dans tableView

  func sort () {
      
        sortedShopLists = coffeeShopLists.sorted {$0.position < $1.position}
    }

Comment j'ai dit: ça marche. mais il devrait être trié de la manière dont il a été trié dans la collection Firebase, mais ce n'est pas le cas. Et désolé pour mon anglais. (

après avoir édité le code comme dans les commentaires ci-dessous en triant par Position. Voici le résultat des instructions d'impression:

[CoffeeShop.CoffeeShopList(name: "ramozoti", shopImage: Optional(<UIImage:0x600003b27de0 anonymous {621, 621}>), position: 2), CoffeeShop.CoffeeShopList(name: "soren", shopImage: Optional(<UIImage:0x600003b34480 anonymous {1080, 1080}>), position: 1), CoffeeShop.CoffeeShopList(name: "coffeesoul", shopImage: Optional(<UIImage:0x600003b31b00 anonymous {1080, 1080}>), position: 3)]

la structure se sent à chaque fois dans un ordre aléatoire

Alors, je suis sur la bonne voie. La dernière question pour la terminer: Comment puis-je trier cette structure par la troisième valeur

["position": 1, "name": soren]
soren
["position": 2, "name": ramozoti]
ramozoti
["position": 3, "name": coffeesoul]
coffeesoul //until this part the result is always the same(correct) and it should be by this order. But the results bellow is always in random order. That part belong to function getFoto()
coffeesoul
[CoffeeShop.CoffeeShopList(name: "coffeesoul", shopImage: <UIImage:0x600000e17600 anonymous {1080, 1080}>)]
ramozoti
[CoffeeShop.CoffeeShopList(name: "coffeesoul", shopImage: <UIImage:0x600000e17600 anonymous {1080, 1080}>), CoffeeShop.CoffeeShopList(name: "ramozoti", shopImage: <UIImage:0x600000e17840 anonymous {621, 621}>)]
soren
[CoffeeShop.CoffeeShopList(name: "coffeesoul", shopImage: <UIImage:0x600000e17600 anonymous {1080, 1080}>), CoffeeShop.CoffeeShopList(name: "ramozoti", shopImage: <UIImage:0x600000e17840 anonymous {621, 621}>), CoffeeShop.CoffeeShopList(name: "soren", shopImage: <UIImage:0x600000e10000 anonymous {1080, 1080}>)]


2 commentaires

Qu'en est-il de l'utilisation de order (par :) ?


"il devrait être trié de la manière dont il est trié dans la collection Firebase" Pourquoi serait-ce? Il n’arrive pas dans cet ordre. Parce que, asynchrone.


3 Réponses :


0
votes

Si vous ne spécifiez pas un ordre des documents dans la requête, Firestore n'en garantit pas un. Les documents ne sont pas fondamentalement classés, sauf en fonction de ce que vous spécifiez dans la requête. Donc, si la commande est importante pour vous, vous devrez vous en occuper vous-même.


0 commentaires

0
votes

Je suis un apprenant sur Swift et je faisais face au même problème, j'ai trouvé le chemin en utilisant .order

db.collection (Constants.FStore.collectionName) .order (par: Constants.FStore. dateField) .addSnapshotListener {(querySnapShot, erreur) dans

tout en persistant, j'ai également persisté un champ de date et je commande par cela. Vous pouvez commander selon un champ différent.

votre code pourrait être

db.collection("coffeeShop").order(by: <<your field>>).getDocuments { (querySnapshot, error)

Comme je l'ai dit, j'apprends Swift mais j'espère que cela vous aidera.


1 commentaires

oui, j'ai fait ça. Mais toujours ils sont toujours orginisés aléatoirement. J'ai regardé le chemin avec des instructions d'impression, là où ça va mal. dans la fonction loadFoto () ses données de grappage comme elles devraient être, mais ensuite en appelant la fonction getFoto () ses noms de grappage au hasard.



0
votes

La console Firestore classe les documents par leur clé. Si vous voulez la même chose dans votre code, vous pouvez

for doc in snapshotDocuments {
    let data = doc.data()
    if let shop = data["name"] as? String {
        self.coffeeShopLists.append(shopList)
        self.getFoto(named: shop, self.coffeeShopLists.length - 1)
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

Voir également: Trier par ID de document firestore?


Votre mise à jour et vos commentaires indiquent qu'il s'agit du chargement des photos liées à ces documents.

Le le chargement des photos commence dans le bon ordre. Mais comme chaque photo prend un temps de chargement différent, elle peut se terminer dans un autre ordre.

Si vous voulez que les photos apparaissent dans l'ordre dans lequel vous aviez les documents, vous devez vous assurer de travailler à partir d'une liste qui maintient l'ordre des documents.

Par exemple, vous pouvez ajouter chaque document à coffeeShopLists avant de commencer à charger sa photo, puis mettre à jour le article dans coffeeShopLists avec la photo.

Donc, dans votre loadFotos vous feriez quelque chose comme ceci: p >

db.collection("coffeeShop")order(by: FieldPath.documentID()).getDocuments(...

Le changement ici est que nous passons l'index du document dans la fonction getFoto , afin qu'il sache quel élément du tableau mettre à jour.

Ensuite, dans getFoto , vous allez affiner l'élément du tableau et mettre à jour cela au lieu d'ajouter un nouvel élément.


3 commentaires

oui, j'ai fait ça. Mais toujours ils sont toujours orginisés aléatoirement. J'ai regardé le chemin avec des instructions d'impression, là où ça va mal. dans la fonction loadFoto () ses données de grappage comme elles devraient être, mais ensuite en appelant la fonction getFoto () ses noms de grappage au hasard.


Ah, c'est tout à fait différent. Le chargement des photos démarre dans le bon ordre. Mais comme chaque photo prend un temps de chargement différent, elle peut se terminer dans un autre ordre.


Une partie de la réponse était utile.Thnx. Mais la solution n'a pas fonctionné pour moi. Mais j'ai fait quelques changements, que je récupère de firebase dans func charge le nom et la position des magasins (j'ai créé une touche supplémentaire "Position". Et maintenant, ma structure ressemble à ceci: (name: "ramozoti", shopImage: {621, 621}>), position: 2). Et la question est: comment puis-je le commander par "position"? J'ai essayé différentes manières, mais je n'ai pas trouvé la bonne solution.