我需要进行异步调用,以便只调用第一个方法之后的第二个方法-- completed.Both方法是网络调用。就像这样:
signIn()
getContacts()我想确保getContacts只在signIn完成后才被调用。FWIW,我无法编辑方法签名,因为它们来自Google。
这就是我试过的:
let queue = DispatchQueue(label: "com.app.queue")
queue.async {
signIn()
getContacts()
}发布于 2016-11-02 17:54:31
异步调用本质上不会运行到完成,然后调用下一件事情。他们立即返回,甚至在他们被要求完成的任务被安排之前。
您需要一些方法来使第二个任务等待第一个任务完成。
NauralInOva给出了一个很好的解决方案:使用一对NSOprations并使它们相互依赖。您还可以将这两个操作放入一个串行队列中,而第二个操作在第一个操作完成之前不会开始。
但是,如果这些调用触发了另一个线程上的异步操作,它们仍然可能返回,操作队列可能会触发第二个操作( getContacts()调用而不等待signIn()完成。
另一个选项是设置接受回调的第一个函数:
signIn( callback: {
getContacts()
}第三种选择是设计一个接受委托的登录对象,一旦完成了委托,登录对象就会调用委托上的signInComplete方法。
这是一件非常常见的事情,以至于大多数网络API都是为它“开箱即用”而构建的。如果Google没有一些工具来处理这个问题,我会感到震惊的。
你在使用什么谷歌框架?你能指出它的文档吗?
发布于 2016-11-02 17:28:01
你在找NSOperation。您可以使用NSOperation使用依赖项将操作链接在一起。一旦一个操作完成,它就可以将它的完成块传递给下一个操作。用例的一个示例可能是:
// AuthOperation is a subclass of NSOperation
let signInOperation = AuthOperation()
// ContactsOperation is a subclass of NSOperation
let getContactsOperation = ContactsOperation()
getContactsOperation.addDependency(signInOperation)雷·温德里希有一个很好的教程,介绍了NSOperation。本教程使用下载操作异步加载图像,该依赖项将在网络请求完成后过滤照片。
苹果也有一个很棒的样本工程,它使用异步网络请求的操作。
https://stackoverflow.com/questions/40385951
复制相似问题