Использование DispatchGroup в цикле for в Swift
У меня есть цикл for, который содержит асинхронный вызов для каждого элемента в цикле. Я пытаюсь написать свой код, чтобы после завершения всех этих вызовов я отправлял уведомление.
Я просмотрел эти темы SO:
группа отправки: for-loop * и * async-вызовы внутри for-loop
Как использовать DispatchGroup для выполнения асинхронных вызовов в цикле for
Но я все еще сталкиваюсь с проблемой, когда мой
DispatchGroup
вызывается до завершения всех асинхронных вызовов в моем цикле for. Это мой код:
func processFetchedMessages(fetchedMessages :[Any]) {
let group = DispatchGroup()
for i in fetchedMessages {
group.enter()
let m: MCOIMAPMessage = i as! MCOIMAPMessage
self.fetchedEmails.append(m)
let operation = imapSession.fetchParsedMessageOperation(withFolder: "INBOX", uid: UInt32(m.uid))
operation?.start{( error, messageParser)-> Void in
let msgPlainBody = messageParser?.htmlBodyRendering()
self.emailBodiesAndUID[m.uid] = msgPlainBody
guard let attachments = messageParser?.attachments() as? [MCOAttachment] else {
return
}
self.attachmentsAndUID[m.uid] = attachments
for a in attachments {
//Check if a video file
if a.mimeType == "video/mp4" {
//Check if it matches the WDYT? pattern ---- this will need to be more secure laer!
if a.filename.contains("WDYT?") {
let video = a.data.getAVAsset()
self.videoAttachmentsAndUID[m.uid] = video
}
}
}
for (uid, _) in self.videoAttachmentsAndUID {
for email in self.fetchedEmails {
if email.uid == uid {
self.emailsWithWDYTAttacments.append(email)
}
}
}
group.leave()
}
group.wait()
}
group.notify(queue: .main) {
print("Finished all requests.")
NotificationCenter.default.post(name: Notification.Name("EmailFetchingFinished"), object: nil)
}
}