Вы можете использовать библиотеку Apache для этого: RandomStringUtils
RandomStringUtils.randomAlphanumeric(20).toUpperCase();
Я подозреваю, что проблема в том, что вы действительно не используете диспетчерскую группу. Проблема здесь в том, что цикл for
по существу выполняется и завершается немедленно - да, эти обратные вызовы будут вызываться в более поздней точке, но это не означает, что код, сообщающий группе диспетчеризации, должен уйти.
(Кроме того, я не вижу вызов notify
в вашем примере кода, но я предполагаю, что это часть кода, который вызывается позже.)
Поэтому, если вы делаете что-то в своем коде, которое зависит от того, что эти изображения уже загружены, вы получите сообщение об ошибке. И я подозреваю, что это, вероятно, работает во второй раз, потому что вы захватываете кешированные данные, которые, вероятно, выполняются достаточно быстро для ваших целей.
Один из способов исправить это - убедиться, что вы добавляете отправку элементы группы в нужных местах. Может быть, что-то вроде этого ...
let group = DispatchGroup()
print("starting ImageSetting")
for query in friendArray {
if imageList[query.uid] == nil {
print("going through iteration")
group.enter()
self.profpicRef.child("profile_pic/" + query.uid + ".jpeg").getData(maxSize: 1
* 1024 * 1024) { (data, error) in
print("accessing image")
if let error = error {
self.imageList[query.uid] = self.defaultImage
} else {
self.imageList[query.uid] = UIImage(data: data!)
}
group.leave()
}
}
}
group.notify(queue: .main) {
print("Images done loading")
}