Возможно, вы ставите notify
в очередь .main
. Или что ваши async
функции не должны находиться в очереди .main
. В любом случае, я бы сделал независимую очередь .concurrent
и поставил бы ваши async
вызовы и notify
на это. т.е.
let customQueue = DispatchQueue(label: "customQueue", attributes: .concurrent)
...
func asyncFuncThatUploadsNewImage(image){
customQueue.async{ ... }
}
func asyncFuncThatDeletesImage(image){
customQueue.async{ ... }
}
...
group.notify(queue: customQueue) {
//continue
}
Мне кажется, что вы правильно используете DispatchGroup.
Помещение вещей в основную очередь отличается от настраиваемой очереди по нескольким причинам, одна из которых состоит в том, что это последовательная, а не параллельная очередь, а также (я думаю), что другие вещи могут выполняться в главной очередичто вы не знаете, что усложняет обоснование, которое вы должны сделать.
Правка из OP Предлагаемое правка сработало, хотя я не совсем уверен, почему. Кроме того, в методе group.notify(queue:)
, несмотря на то, что я прошел пользовательскую очередь, мне пришлось обернуть вложенный код в основной поток. Это интересно, но вот код, который работает:
@IBAction func saveButtonPressed(_ sender: Any) {
let oldUrls = parentVC.photoUrls
activityIndicator.isHidden = false
activityIndicator.startAnimating()
let photoUploader = PhotoUploader()
var data = [Data]()
var urls: [Int:String] = [:]
//Custom queue
let customQueue = DispatchQueue(label: "customQueue", attributes: .concurrent)
let group = DispatchGroup()
for oldUrl in oldUrls {
group.enter()
customQueue.async {
let storageRef = Storage.storage().reference(forURL: oldUrl)
//Removes image from storage
storageRef.delete { error in
if let error = error {
print(error)
group.leave()
} else {
// File deleted successfully
print("File deleted, took \(Date().timeIntervalSince1970 - startTime) seconds")
group.leave()
}
}
}
}
for (index,image) in imagesArray.enumerated() {
group.enter()
customQueue.async {
let imageData = image.jpegData(compressionQuality: 1)!
data.append(imageData)
photoUploader.upload(image: image, to: "Users/\(Auth.auth().currentUser!.uid)/photoUrls/\(index)", completion: {(url, error) in
if error == nil {
urls[index] = url
group.leave()
print("Image uploaded, took \(Date().timeIntervalSince1970 - startTime) seconds")
} else {
print(error?.localizedDescription)
group.leave()
}
})
}
}
for i in imagesArray.count...6 {
Database.database().reference().child("Users/\(Auth.auth().currentUser!.uid)/photoUrls/\(i)").removeValue()
}
group.notify(queue: customQueue) {
DispatchQueue.main.async {
//Do whatever I need to do
}
}