我需要进行异步调用,以便仅在第一个方法完成后才调用第二个方法。两个方法都是网络调用。像这样:
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框架?您可以指向它的文档吗?