Загрузка из Firebase так медленно - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить данные из firebase, но я думаю, что что-то не так в моем коде.Ниже я поделюсь своим методом извлечения и структурой Firebase, если бы вы могли мне помочь. Я был бы очень рад этому

Это первая часть процесса извлечения

  DispatchQueue.main.async {

        Database.database().reference().child("Products/\(categoryUID)").observe(.value) { (snapshot) in
            if let result = snapshot.children.allObjects as? [DataSnapshot] {
                for child in result {
                    let companyId = child.key
                    self.getCompanyName(compID: companyId)
                    print(result)
                }
            }
        }

    }

После того, как я получу компанию, я буду использовать второй метод извлечения для заполнения tableView

 Database.database().reference().child("company").child(compID).observeSingleEvent(of: .value, with: { (snapshot) in
            guard let dictionary = snapshot.value as? [String: Any] else {return}
            self.company = Company(dictionary: dictionary, uid: compID)
            self.data.append(self.company!)
            print(self.data)
            self.tableView.reloadData()


        }) { (err) in
            print("Failed to fetch user for posts:", err)
        }

Этот процесс занимает слишком много времени, около 15-20 секунд.Я не смог найти причину проблемы

Вот структура базы

"Products" : {
"-LCJzPPR6knojTMm3sqd" : {
  "-LCJz95HuFlcrpGeRMa2" : {
    "-LCK3ysCZTUG7rBBZuRS" : {
      "product_detail" : "2325423542342",
      "product_image_url" : [ "https://firebasestorage.googleapis.com/v0/b/e-fiyat-69e44.appspot.com/o/p%2F1526140758172-1.jpg?alt=media&token=8e9c3feb-c722-427a-98e3-c02a27607874" ],
      "product_name" : "DENEME12",
      "product_price" : "234"
    }
  }
},

"category" : {
"-LCJzPPR6knojTMm3sqd" : {
  "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/e-fiyat-69e44.appspot.com/o/category%2F1526139301086-Sandalye%20ve%20Koltuklar.png?alt=media&token=401ce15e-d08d-4487-9d79-67ec54e3f2b4",
  "name" : "Sandalye & Koltuklar"
},

"company" : {
"-LCJz95HuFlcrpGeRMa2" : {
  "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/e-fiyat-69e44.appspot.com/o/company%2F1526139234155-cad.png?alt=media&token=9371db0c-d191-4277-93f6-871c43e758eb",
  "name" : "Cadı"
},

Пока я пишу эту функцию, логика выглядит следующим образом:

  • Первые выбранные категории
  • Вторые выбранные компании (Задержка в этом разделе)
  • Третьи выбранные продукты

Нам нужен доступ к каждому продукту для определения, какая компания имеет категорию.

Надеюсь, я четко объяснил себе

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

1) Это очень похоже на тот факт, что перезагрузка tableView не происходит в основном потоке.Попробуйте добавить DispatchQueue.main.async для self.tableView.reloadData () :

func updateCompanies() {
    Database.database().reference().child("company").child(compID).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String: Any] else { return }

        self.company = Company(dictionary: dictionary, uid: compID)
        self.data.append(self.company!)
        print(self.data)

        DispatchQueue.main.async {
            self.tableView.reloadData()
        }

    }) { (err) in
        print("Failed to fetch user for posts:", err)
    }
}

2) Кроме того, если у вас много элементов вбазы данных, постарайтесь не получить все сразу.Используйте queryLimitedToLast

Database.database().reference().child("Products/\(categoryUID)").queryLimited(toLast: 20).observe(.value) { ... }
0 голосов
/ 06 октября 2018

Сначала я рекомендую это: https://firebase.google.com/docs/database/ios/structure-data

Тогда структура ваших продуктов может быть такой, если я правильно понял вашу потребность.Но вы получите основную идею.

"Products" : {
"products-uid" : {
      "product_detail" : "2325423542342",
      "product_image_url" : [ "https://firebasestorage.googleapis.com/v0/b/e-fiyat-69e44.appspot.com/o/p%2F1526140758172-1.jpg?alt=media&token=8e9c3feb-c722-427a-98e3-c02a27607874" ],
      "product_name" : "DENEME12",
      "product_price" : "234",
      "companies": {
         // the value here doesn't matter, just that the key exists
         "company-one-uid": true,
         "company-two-uid": true,
          ...

         }
      "categories": {
             // the value here doesn't matter, just that the key exists
             "cat-one-uid": true,
             "cat-two-uid": true,
              ...

             }
}


"companies" : {
  "company-one-uid" : {
  "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/e-fiyat-69e44.appspot.com/o/company%2F1526139234155-cad.png?alt=media&token=9371db0c-d191-4277-93f6-871c43e758eb",
  "name" : "Cadı"
  }
  "company-two-uid" : {...

  }
}

"categories" : {
    "cat-one-uid" : {....

Тогда, возможно, вы можете отфильтровать товары, если они содержат компанию или категорию, с помощью метода queryOrdered .

...