我有多个网络请求需要按顺序发生。他们必须等到上一个完成并从服务器收到响应。
现在我有一个死亡回调金字塔。有更自动化的方式吗?我尝试了一个OperationQueue
,但它不等待请求完成,然后进入下一个请求,即使它设置为一次执行一个请求。
对于它的价值,.save
是对CloudKit的网络请求。与其他CloudKit操作一样,没有CloudKit订阅队列。
self.privateDB.save(subscriptions[0]){ savedSubscription, error in
//Request 1 is done
self.privateDB.save(subscriptions[1]){ savedSubscription, error in
//Request 2 is done
self.privateDB.save(subscriptions[2]){ savedSubscription, error in
//All 3 requests are done
}
}
}
我尝试了DispatchGroup
,但这似乎不起作用。在等待回复之前,所有请求似乎都已启动。
let group = DispatchGroup()
//Create a subscription for every record type
for subscription in subscriptions{
group.enter()
//...
self.privateDB.save(subscription){ savedSubscription, error in
group.leave()
}
}
group.wait()
有什么想法吗?
答案 0 :(得分:1)
尝试使用信号量使它们同步。
创建信号量
var semaphore = dispatch_semaphore_create(0)
等待完成第一次api通话
dispatch_semaphore_wait(信号量,DISPATCH_TIME_FOREVER)
在第1次api完成时发出信号量信号。
dispatch_semaphore_signal(旗语)
前:
var semaphore = dispatch_semaphore_create(0) self.privateDB.save(subscriptions [0]){savedSubscription,错误 dispatch_semaphore_signal(信号灯) } dispatch_semaphore_wait(信号量,DISPATCH_TIME_FOREVER) self.privateDB.save(subscriptions [1]){savedSubscription,error in}
答案 1 :(得分:1)
您应该能够创建一个或多个=
来保存订阅,然后使用CKModifySubscriptionsOperation
来运行它们。如果您需要它们按顺序运行,请在它们之间设置依赖关系以确保它们按顺序运行:
CKDatabase.add()