Swift 3中的顺序网络请求

时间:2017-09-07 04:45:38

标签: swift3 grand-central-dispatch nsoperationqueue cksubscription

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

现在我有一个死亡回调金字塔。有更自动化的方式吗?我尝试了一个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()

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

尝试使用信号量使它们同步。

  1. 创建信号量

    var semaphore = dispatch_semaphore_create(0)

  2. 等待完成第一次api通话

    dispatch_semaphore_wait(信号量,DISPATCH_TIME_FOREVER)

  3. 在第1次api完成时发出信号量信号。

    dispatch_semaphore_signal(旗语)

  4. 前:

    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()