Использование DispatchGroup в цикле for в Swift

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

Я просмотрел эти темы SO:

группа отправки: for-loop * и * async-вызовы внутри for-loop

Как использовать DispatchGroup для выполнения асинхронных вызовов в цикле for

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)
      }
}

0 ответов

Другие вопросы по тегам