My function runsQueries
runs two different queries. And i need these two queries to be completed before I can call updateResults
function.
What is the best approach to get it done? I've tried a few different things but nothing actually worked so far.
func runsQueries(){
var foundRecords = [CKRecords]()
let notified = dispatch_semaphore_create(0)
let group = dispatch_group_create()
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_group_async(group, queue) {
// query 1
let predicate1 = NSPredicate(format: "userID = %@", user1ID)
let cloudKitQuery1 = CKQuery(recordType: "Messages", predicate: predicate1)
publicDatabase.performQuery(cloudKitQuery1, inZoneWithID: nil) { (messageRecords: [CKRecord]?, error: NSError?) in
if error != nil
{
print("-> cloudKitLoadMessage - userID1 error \(error)")
}
else
{
print("-> cloudKitLoadMessage - user1Done - message")
foundRecords.apend(messageRecords[0])
}
}
// query 2
let predicate2 = NSPredicate(format: "userID = %@", user2ID)
let cloudKitQuery2 = CKQuery(recordType: "Messages", predicate: predicate2)
publicDatabase.performQuery(cloudKitQuery2, inZoneWithID: nil) { (messageRecords: [CKRecord]?, error: NSError?) in
if error != nil
{
print("-> cloudKitLoadMessage - userID2 error \(error)")
}
else
{
print("-> cloudKitLoadMessage - user2Done - message")
foundRecords.apend(messageRecords[0])
}
}
}
dispatch_group_notify(group, queue) {
// This block will be executed when all tasks are complete
print("All tasks complete")
dispatch_semaphore_signal(notified)
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
dispatch_semaphore_wait(notified, DISPATCH_TIME_FOREVER)
print("Semaphore done")
// only call updateResults when queries 1 and 2 are done
updateResults(foundRecords)
}
Second function
func updateResults(messageRecords: [CKrecord]){
// do something now that you got both messages
}
Based some ideas from: https://gist.github.com/nbhasin2/735cd80298b5d47852f2