首页 > 解决方案 > 嵌套循环的调度组

问题描述

我已经与多个用户列表共享扩展,我可以为所有选定的用户选择多个用户和多个图像。为此,我使用了调度组,所有用户都有两个循环 1,所有选定图像在该循环内。

let myGroup = DispatchGroup()
let myGroupMain = DispatchGroup()
let dispatchQueue = DispatchQueue.global(qos: .background)
dispatchQueue.async {
for indexPath in self.indexPathContain  {
 myGroupMain.enter()

 for (index, attachment) in (content.attachments as! [NSItemProvider]).enumerated() {
   myGroup.enter()
  let paramDict = [
   "id":"0",
   "chat_id":modelList.id!,
   "sender_id":  x,
   "image":"",
   "receiver_id": modelList.sender_id!,
   "type": "1",
   "message": "",
   "file":dataArr,
   ] as [String : Any]
   self?.socket?.emit("upload_files", paramDict)
    myGroup.leave()
 }
 myGroup.notify(queue: .main) {
            myGroupMain.leave()
        }
}
 myGroupMain.notify(queue: .main) {

       self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
                print(i)
           }

}

在上述情况下,当我执行时,它将myGroupMain.notify没有完成myGroup循环完成。斯威夫特 5/Xcode 11.3

标签: iosswiftiphoneshare-extension

解决方案


早些时候,我也遇到过同样的问题。我通过定义myGroupmyGroupMain全局解决了这个问题。

请参考下面的代码。

class ClassName {

    let myGroup = DispatchGroup()
    let myGroupMain = DispatchGroup()
    let dispatchQueue = DispatchQueue.global(qos: .background)

    func yourCode(){
        dispatchQueue.async {
            for indexPath in self.indexPathContain  {
                myGroupMain.enter()

                for (index, attachment) in (content.attachments as! [NSItemProvider]).enumerated() {
                    myGroup.enter()
                    let paramDict = [
                        "id":"0",
                        "chat_id":modelList.id!,
                        "sender_id":  x,
                        "image":"",
                        "receiver_id": modelList.sender_id!,
                        "type": "1",
                        "message": "",
                        "file":dataArr,
                        ] as [String : Any]
                    self?.socket?.emit("upload_files", paramDict)
                    myGroup.leave()
                }
                myGroup.notify(queue: .main) {
                    myGroupMain.leave()
                }
            }
            myGroupMain.notify(queue: .main) {

                self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
                print(i)
            }

        }
}

推荐阅读