【发布时间】:2016-06-07 02:53:24
【问题描述】:
我的函数runsQueries 运行两个不同的查询。在调用updateResults 函数之前,我需要完成这两个查询。
完成它的最佳方法是什么?我尝试了一些不同的方法,但到目前为止都没有真正奏效。
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)
}
第二个功能
func updateResults(messageRecords: [CKrecord]){
// do something now that you got both messages
}
基于来自https://gist.github.com/nbhasin2/735cd80298b5d47852f2的一些想法
【问题讨论】:
标签: ios swift semaphore dispatch