Naveen Ramanathan
Naveen Ramanathan

Reputation: 2206

Swift Closures in for loop

Currently I am having code which executes a closure inside a loop. I want to know when all the closures have finished executing. Currently I am using a counter and incrementing it when the closure is completed and then I compare it with the no of times to be executed. Code is below

var count = 0
var noOfTimes = 10
for i in 0..<noOfTimes {
    someVariable.someClosure {
        result in
        count = count + 1
        if count == noOfTimes {
            //do something
        }
    }
}

Is there a better way to do this without the counter. Thanks.

Upvotes: 2

Views: 2739

Answers (1)

Paulw11
Paulw11

Reputation: 114836

You can use a DispatchGroup for this. It works like a counted semaphore. You can increase the count by calling enter and decrease the count by calling leave. You can schedule a closure to be executed when the count reaches 0 using notify:

let dispatchGroup = DispatchGroup()
var noOfTimes = 10
for i in 0..<noOfTimes {
    dispatchGroup.enter()  //  Enter the dispatch group
    someVariable.someClosure {
        result in
        // Process result
        ...
        dispatchGroup.leave() // Exit dispatch group
    }
}
dispatchGroup.notify(queue: DispatchQueue.main, execute: {
    print("All Done")
})

Upvotes: 14

Related Questions