Как получить количество снимков с помощью Swift Code - PullRequest
0 голосов
/ 24 сентября 2019

Я новичок в разработке и разработке моего первого приложения.В моем приложении есть представление коллекции, в которой я хочу отображать изображения.Эти изображения получены из базы данных Firebase.

Структура базы данных Firebase выглядит следующим образом:

{
  "CHILD1" : {
    "URL1" : "https://Child1_url1.com",
    "URL2" : "https://Child1_url2.com",
    "URL3" : "https://Child1_url3.com"
  }
  "CHILD2" : {
    "URL1" : "https://Child2_url1.com",
    "URL2" : "https://Child2_url2.com",
  }
  "CHILD3" : {
    "URL1" : "https://Child3_url1.com",

  }

}

Для получения URL-адресов я использую код ниже

override func viewDidLoad() {
        super.viewDidLoad()
       checkSectionCount()
   }

func checkSectionCount(){
    Database.database().reference().observe(.value) { (snapShot: DataSnapshot) in

        let snapDict = snapShot.value as? NSDictionary
        let snapCnt = String(snapDict!.count)
        print("snapCnt --> \(snapCnt)")// This prints the number of child counts correctly

    }
 }

 func numberOfSections(in collectionView: UICollectionView) -> Int {
    return snapCnt //I am unable to refer the snapCnt to set the number of section dynamically here

}

Как указано в коде выше, я не могусм. snapCnt вне функции checkSectionCount.Я также пытался вернуть это значение в качестве параметра функции, однако swift не может определить snapCnt из

Database.database().reference(){ Code

}

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

1 Ответ

0 голосов
/ 24 сентября 2019

Данные загружаются из Firebase асинхронно, поскольку может потребоваться некоторое время, чтобы они вернулись с сервера.Вместо того, чтобы блокировать код (и приложение перестает отвечать на запросы), основной код продолжает работать.Затем, когда код возвращается с сервера, вызывается обработчик завершения.

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

print("Before starting to get data")
Database.database().reference().observe(.value) { (snapShot: DataSnapshot) in
    print("Got data")
}
print("After starting to get data")

Когда вы запускаетеЭтот код печатает:

Перед началом получения данных

После начала получения данных

Полученные данные

Этовероятно, не тот порядок, который вы ожидали, хотя это нормальное и задокументированное поведение.

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

Дополнительные примеры того, как с этим справиться, см .:

...