почему данные в tableview всегда сортируются случайным образом? - PullRequest
0 голосов
/ 18 июня 2020

здесь имеет отношение к моей части вопроса в моем коде, и она работает почти нормально, за исключением одного. Данные всегда сортируются случайным образом. О коде: я должен получить данные (название CoffeeShop и .jpg) от firebase и отобразить фото в tableView

var coffeeShopLists: [CoffeeShopList] = []

struct CoffeeShopList {
    let name: String
    let shopImage: UIImage
}

func loadShops () {
        coffeeShopLists = []
        db.collection("coffeeShop").getDocuments { (querySnapshot, error) in
            if let e = error {
                print("Error\(e)")
            } else {
                if let snapshotDocuments = querySnapshot?.documents {
                    for doc in snapshotDocuments {
                        let data = doc.data()
                        print(doc.data())
                        if let shop = data["name"] as? String {
                            print(shop)
                             self.getFoto(named: shop)
//                            self.coffeeShopLists.append(shopList)  //retrieving Data from firebase
                            DispatchQueue.main.async {
                                self.tableView.reloadData()
                            }
                        }
                    }
                }
            }
        }      
    }

func getFoto (named: String) {
        let storage = Storage.storage().reference().child("CoffeeShops/\(named).jpg")
        storage.getData(maxSize: 1 * 1024 * 1024) {data, error in
        if let error = error {
           return print(error)
        } else {
            if let image = UIImage(data: data!) {
                let newList = CoffeeShopList(name: named, shopImage: image)
                self.coffeeShopLists.append(newList)
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }

    }
          
   }        
 }

override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.register(UINib(nibName: "CoffeeShopCell", bundle: nil), forCellReuseIdentifier: "ReusableCell")
        loadShops()
    }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! CoffeeShopCell
        cell.shopImage.image = coffeeShopLists[indexPath.row].shopImage
        return cell
    }

Как я уже сказал: это работает. но он должен быть отсортирован так, как он отсортирован в коллекции firebase. Но это не так. И извините за мой engli sh. (

после редактирования кода, как в комментариях ниже, упорядочивая по позиции. Вот результат операторов печати:

["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}>)]

структура ощущается каждый раз случайный порядок

Итак, я на правильном пути. Последний вопрос к завершению sh it: Как я могу отсортировать эту структуру по третьему значению

[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)]

Вот и все, теперь он работает. Я сделал дополнительную функцию

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

и вставил ее в функцию getFoto () после self.coffeeShopLists.append(newList), возможно, это был более элегантный способ решить мою проблему, но я нашел только это.

Ответы [ 3 ]

0 голосов
/ 19 июня 2020

Я изучаю Swift и столкнулся с той же проблемой, я выяснил способ, используя .order

db.collection(Constants.FStore.collectionName).order(by: Constants.FStore.dateField).addSnapshotListener { (querySnapShot, error) in

при сохранении, я также сохранил поле даты и Я заказываю по этому. Вы можете сделать заказ по другому полю.

ваш код может быть

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

Как я уже сказал, я изучаю Swift, но надеюсь, что это поможет.

0 голосов
/ 19 июня 2020

Консоль Firestore упорядочивает документы по их ключу. Если вы хотите то же самое в своем коде, вы можете

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

См. Также: Заказ по идентификатору документа firestore?


Ваше обновление и комментарии указывают на речь идет о загрузке фотографий, относящихся к этим документам.

Загрузка фотографий начинается в правильном порядке. Но поскольку для загрузки каждой фотографии требуется разное время, она может заполнить в другом порядке.

Если вы хотите, чтобы фотографии отображались в том порядке, в котором у вас были документы, вам следует убедитесь, что вы работаете из списка, который поддерживает порядок документов.

Например, вы можете добавить каждый документ в coffeeShopLists перед загрузкой его фотографии, а затем обновить элемент в coffeeShopLists с фото.

Итак, в вашем loadFotos вы бы сделали что-то вроде этого:

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()
        }
    }
}

Изменение в том, что мы передаем индекс документа в функцию getFoto, чтобы она знала, какой элемент в массиве нужно обновить.

Затем в getFoto вы исправляете элемент массива и обновите вместо добавления новый товар.

0 голосов
/ 18 июня 2020

Если вы не укажете порядок документов в запросе, Firestore не гарантирует его. Документы принципиально не упорядочены, за исключением того, что вы указали в запросе. Так что, если для вас важен заказ, вам придется организовать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...