здесь имеет отношение к моей части вопроса в моем коде, и она работает почти нормально, за исключением одного. Данные всегда сортируются случайным образом. О коде: я должен получить данные (название 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)
, возможно, это был более элегантный способ решить мою проблему, но я нашел только это.