首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步斯威夫特3

异步斯威夫特3
EN

Stack Overflow用户
提问于 2016-11-02 17:17:31
回答 2查看 764关注 0票数 1

我需要进行异步调用,以便只调用第一个方法之后的第二个方法-- completed.Both方法是网络调用。就像这样:

代码语言:javascript
复制
signIn()
getContacts()

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

这就是我试过的:

代码语言:javascript
复制
let queue = DispatchQueue(label: "com.app.queue")

queue.async {
signIn()
getContacts()

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 17:54:31

异步调用本质上不会运行到完成,然后调用下一件事情。他们立即返回,甚至在他们被要求完成的任务被安排之前。

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

NauralInOva给出了一个很好的解决方案:使用一对NSOprations并使它们相互依赖。您还可以将这两个操作放入一个串行队列中,而第二个操作在第一个操作完成之前不会开始。

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

另一个选项是设置接受回调的第一个函数:

代码语言:javascript
复制
signIn( callback: {
  getContacts()
}

第三种选择是设计一个接受委托的登录对象,一旦完成了委托,登录对象就会调用委托上的signInComplete方法。

这是一件非常常见的事情,以至于大多数网络API都是为它“开箱即用”而构建的。如果Google没有一些工具来处理这个问题,我会感到震惊的。

你在使用什么谷歌框架?你能指出它的文档吗?

票数 1
EN

Stack Overflow用户

发布于 2016-11-02 17:28:01

你在找NSOperation。您可以使用NSOperation使用依赖项将操作链接在一起。一旦一个操作完成,它就可以将它的完成块传递给下一个操作。用例的一个示例可能是:

代码语言:javascript
复制
// AuthOperation is a subclass of NSOperation
let signInOperation = AuthOperation()
// ContactsOperation  is a subclass of NSOperation
let getContactsOperation = ContactsOperation()

getContactsOperation.addDependency(signInOperation)

雷·温德里希有一个很好的教程,介绍了NSOperation。本教程使用下载操作异步加载图像,该依赖项将在网络请求完成后过滤照片。

苹果也有一个很棒的样本工程,它使用异步网络请求的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40385951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档