我需要进行异步调用,以便仅在第一个方法完成后才调用第二个方法。两个方法都是网络调用。像这样:

signIn()
getContacts()

我想确保只有在登录完成后才调用getContacts。 FWIW,我无法编辑方法签名,因为它们来自Google SDK。

这是我尝试的:
let queue = DispatchQueue(label: "com.app.queue")

queue.async {
signIn()
getContacts()

}

最佳答案

从本质上讲,异步调用不会运行到完成,然后再调用下一个。在要求他们完成任务之前,他们会立即返回。

您需要某种方法使第二个任务等待第一个任务完成。

NauralInOva提供了一个很好的解决方案:使用一对NSOpration,并使它们彼此依赖。您还可以将这两个操作放入一个串行队列中,而第二个操作要等到第一个操作完成后才能开始。

但是,如果这些调用在另一个线程上触发了异步操作,则它们可能仍会返回并且操作队列可能会触发第二个操作(getContacts()调用,而无需等待signIn()完成。

另一个选择是设置第一个函数以进行回调:

signIn( callback: {
  getContacts()
}

第三种选择是设计一个带有委托的登录对象,登录完成后,登录对象将在委托上调用signInComplete方法。

这是一件很平常的事情,大多数网络API都是“开箱即用”的。如果Google API没有处理此问题的功能,我会感到震惊。

您正在使用什么Google框架?您可以指向它的文档吗?

10-08 06:29