【问题标题】:How to use Dispatch Group in a loop with asynchronous Function Swift?如何在带有异步函数 Swift 的循环中使用调度组?
【发布时间】:2020-07-25 19:38:21
【问题描述】:

我已经检查了有关此主题的所有问题,但没有一个有帮助。 我有如下代码。现在,只要代码进入for id in stringArray 循环,它就会执行stringArray.count 次,甚至无需进入firestore 异步部分。这是可以理解的,但不是我的要求。我希望在循环和异步代码完成后执行myGroup.notify。但是由于循环很容易完成,所以即使异步尚未完成,myGroup.notify 也会被调用。所以,基本上可能是我在这里要求将myGroup.entermyGroup.leave 放在正确的位置。谢谢!

我的代码:

func Promise_searchedDataFromDB(stringArray:[String]) {
    for id in stringArray {
        myGroup.enter()
    collectionRef.getDocuments { (querySnapshot, error) in
        if error != nil {
            return
        }
        else {
               guard let snapshot = querySnapshot else {return}
               for document in snapshot.documents {
                
                let myData = document.data()
                if StaticVariable == true {
             
                    self.typeOfListing = myData["Type"] as? String ?? "Not Found"
                    self.charges = Int(myData["Charges"] as? String ?? "Not Found") ?? 0
                    self.nameOfListing = myData["Title"] as? String ?? "Not Found"
                    self.currency = myData["Currency"] as? String ?? "Not Found"
                    self.days = myData["Days"] as? String ?? "Not Found"
                    self.details = myData["Description"] as? String ?? "Not Found"
                    self.cityName = myData["City"] as? String ?? "Ghost"
                    
                    let dataArray = CellComponents(image: UIImage(named: "b")!, typeOfListing: self.typeOfListing , charges: self.charges, rating: 4.1, nameOfListing: self.nameOfListing , cityName: self.cityName, detail: self.details, currency: self.currency, days: self.days)
                    self.ArrayToHoldSearchedListing.append(dataArray)
                    self.tableView.reloadData()
                }
              }
            }
          }

             myGroup.leave()
       }
        
        myGroup.notify(queue: .main) {
            print("All done")
        }
   }

【问题讨论】:

    标签: swift for-loop dispatchgroup


    【解决方案1】:

    离开异步块而不是它之外......并且输入应该等于离开所以把它放在 defer 语句中总是在离开范围之前执行

      func Promise_searchedDataFromDB(stringArray:[String]) {
         for id in stringArray {
             myGroup.enter()
         collectionRef.getDocuments { (querySnapshot, error) in
            defer{  myGroup.leave() }
            
             if error != nil {
                 return
             }
             else {
                    guard let snapshot = querySnapshot else {return}
                    for document in snapshot.documents {
                     
                     let myData = document.data()
                     if StaticVariable == true {
                  
                         self.typeOfListing = myData["Type"] as? String ?? "Not Found"
                         self.charges = Int(myData["Charges"] as? String ?? "Not Found") ?? 0
                         self.nameOfListing = myData["Title"] as? String ?? "Not Found"
                         self.currency = myData["Currency"] as? String ?? "Not Found"
                         self.days = myData["Days"] as? String ?? "Not Found"
                         self.details = myData["Description"] as? String ?? "Not Found"
                         self.cityName = myData["City"] as? String ?? "Ghost"
                         
                         let dataArray = CellComponents(image: UIImage(named: "b")!, typeOfListing: self.typeOfListing , charges: self.charges, rating: 4.1, nameOfListing: self.nameOfListing , cityName: self.cityName, detail: self.details, currency: self.currency, days: self.days)
                         self.ArrayToHoldSearchedListing.append(dataArray)
                         self.tableView.reloadData()
                     }
                   }
                 }
               }
    
                
            }
             
             myGroup.notify(queue: .main) {
                 print("All done")
             }
        }
    

    【讨论】:

    • 哦,是的,先生!效果很好! defer 这件事对我来说很新鲜,也很有帮助。谢谢!
    • 欢迎您@FahadAli ...如果可行,请接受答案..快乐编码=)
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2015-04-18
    • 1970-01-01
    • 2019-02-15
    • 2011-12-03
    • 2021-05-02
    相关资源
    最近更新 更多