Search code examples
swiftswift3swift4swift5

Confused about async block inside loop


I want to print the data only after executing all loops inside the closure block, since I don't know how to use dispatch group exactly. I have tried in several ways.

What am I doing wrong here?

private func recognizeText(images: [UIImage]) {
    
    let myDispatchGroup = DispatchGroup()
    
    self.extractedTextfromImages(images: images) { blocks in
        myDispatchGroup.enter()
        
        for block in blocks {
            
            for line in block.lines {
                
                
                //save emirate id
                if isValidEmiratesID(emiratesID: line.text) == true {
                    
                    let id  = line.text
                    self.dt.id = id
                }
                
                // save name
                if line.text.lowercased().range(of: "name") != nil {
                    
                    
                    if let range = line.text.range(of: ":") {
                        let nm = line.text[range.upperBound...]
                        let name = String(nm.trimmingCharacters(in: .whitespaces))
                        self.dt.name = name
                    }
                }
                
            }
            
        }
        myDispatchGroup.leave()
    }
    
    myDispatchGroup.notify(queue: .main) {
        print("data is \(self.dt)")
    }
    
    
    
}

Solution

  • myDispatchGroup.enter()
                  
            for i in 1...3 {
                
             print("out")
                for i in 1...3 {       
                         print("inner")   
                               } 
                           }
                    myDispatchGroup.leave()
                
                
                myDispatchGroup.notify(queue: .main) {
                    print(“now loop ended ")
                
        }
    

    Output =

    out

    inner

    inner

    inner

    out

    inner

    inner

    inner

    out

    inner

    inner

    inner

    now loop ended