Единственное место, где я могу увидеть потенциал для исключения вне границ, это
print(self.names[1])
Скорее всего, вы можете установить точку останова и вручную проверить массив имен (po self.names
)
У вас неправильный подход, но я собираюсь исправить ваш код для справки. ТОГДА подскажу, что вы должны делать
В любом случае, чтобы вы могли подумать о том, почему это происходит, проблема заключается в следующих строках кода:
myGroup.enter()
firebase()
// When your task completes
myGroup.leave()
Ваш комментарий неверный. У созданной вами забавной базы Firebase c есть некоторый асин c код - так что он завершится sh и почти сразу перейдет к myGroup.leave()
fun c. Вы хотите уйти, когда завершится асин c код. Самый стандартный способ выполнения sh - это, безусловно, просто использовать обработчик завершения вместо DispatchGroup
(vadian опубликовал это решение, пока я писал). Но просто чтобы проиллюстрировать вашу ошибку:
func firebase(dispatchGroup: DispatchGroup) {
...
// this is an async call vv
db.collection(test).getDocuments { (snapshot, err) in
... // all the code
// NOW that you're done, leave the group
dispatchGroup.leave()
}
}
, тогда вы можете передать ее как:
myGroup.enter()
firebase(dispatchGroup: myGroup)
Однако ... вам не следует ждать, пока этот ответ выполнит basi c код компоновки. Я не уверен, какой из этих методов на самом деле использует self.names
или self.descriptions
, но любые из этих строк, которые не могут быть просто выполнены сразу:
override func viewDidLoad() {
super.viewDidLoad()
firebase()
self.setupBottomControls()
self.setupTopControls()
self.setupButton()
// im going to pretend this function relies on the self.names/self.descriptions
// self.setupImages()
self.collectionView?.backgroundColor = .white
self.collectionView?.register(PageCell.self, forCellWithReuseIdentifier: "cellId")
self.collectionView?.isPagingEnabled = true
}
, затем один раз функция firebase хорошо заканчивается, просто вызовите ту, которая опирается на данные ...
func firebase()
{
//connection to firebase for the names and descriptions
let db = Firestore.firestore()
db.collection(test).getDocuments { (snapshot, err) in
// code
// now that im done and I have the data...
DispatchQueue.main.async {
self.setupImages()
// self.collectionView.reloadData() // also maybe this??
}
}
}
вам не нужно делать все в viewDidLoad
, просто сделайте это, когда будете готовы.