Swift3 Swift 3中的顺序网络请求

Swift3 Swift 3中的顺序网络请求,swift3,grand-central-dispatch,nsoperationqueue,cksubscription,Swift3,Grand Central Dispatch,Nsoperationqueue,Cksubscription,我有多个网络请求需要按顺序进行。他们必须等待上一个操作完成并从服务器收到响应 现在我有一个死亡金字塔。有没有一种更自动化的方法?我尝试了一个操作队列,但它不会等到请求完成后再前进到下一个请求,即使它设置为一次执行一个请求 值得一提的是,.save是对CloudKit的网络请求。没有像其他CloudKit操作一样的CloudKit订阅队列 self.privateDB.save(subscriptions[0]){ savedSubscription, error in //Request 1

我有多个网络请求需要按顺序进行。他们必须等待上一个操作完成并从服务器收到响应

现在我有一个死亡金字塔。有没有一种更自动化的方法?我尝试了一个
操作队列
,但它不会等到请求完成后再前进到下一个请求,即使它设置为一次执行一个请求

值得一提的是,
.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()

有什么想法吗?

试着用信号量使它们同步

  • 创建信号量

    var信号量=调度信号量创建(0)

  • 等待第一次api调用完成

    调度信号灯等待(信号灯,调度时间永远)

  • 在第一个api完成时发出信号

    调度信号灯信号灯(信号灯)

  • 例:

    var信号量=调度信号量创建(0) self.privateDB.save(订阅[0]){savedSubscription,中出错 调度信号灯信号灯(信号灯) } 调度信号灯等待(信号灯,调度时间永远)
    self.privateDB.save(subscriptions[1]){savedSubscription,错误在}

    您应该能够创建一个或多个
    ckmodifysubscriptions操作来保存订阅,然后使用
    CKDatabase.add()
    来运行它们。如果需要它们按顺序运行,请设置它们之间的依赖关系,以确保它们按顺序运行:

    let subscriptionOp1 = CKModifySubscriptionsOperation(subscriptionsToSave: subscriptions[0], subscriptionsToDelete: nil)
    let subscriptionOp2 = CKModifySubscriptionsOperation(subscriptionsToSave: subscriptions[1], subscriptionsToDelete: nil)
    let subscriptionOp3 = CKModifySubscriptionsOperation(subscriptionsToSave: subscriptions[2], subscriptionsToDelete: nil)
    
    subscriptionOp2.addDependency(subscriptionOp1)
    subscriptionOp3.addDependency(subscriptionOp2)
    
    database.add(subscriptionOp1)
    database.add(subscriptionOp2)
    database.add(subscriptionOp3)
    

    我不知道我是如何忽略了
    ckmodifysubscriptions操作的。这正是我需要的。非常感谢。