异步 swift 3

Asynchronous swift 3

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

signIn()
getContacts()

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

这是我试过的:

let queue = DispatchQueue(label: "com.app.queue")

queue.async {
signIn()
getContacts()

}

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

// AuthOperation is a subclass of NSOperation
let signInOperation = AuthOperation()
// ContactsOperation  is a subclass of NSOperation
let getContactsOperation = ContactsOperation()

getContactsOperation.addDependency(signInOperation)

Ray Wenderlich 有一个关于 NSOperation 的很棒的教程。本教程使用下载操作异步加载图像,依赖项将在网络请求完成时过滤照片。

A​​pple 也有一个很棒的 sample project,它使用异步网络请求操作。

异步调用,就其本质而言,不会运行完成然后调用下一件事。他们 return 立即,在要求他们完成的任务甚至还没有安排之前。

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

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

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

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

signIn( callback: {
  getContacts()
}

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

这是一件很常见的事情,大多数网络 API 都是为此而构建的 "out out of the box." 如果 Google API 没有,我会感到震惊有一些设施来处理这个。

您使用的是什么 Google 框架?你能指出它的文档吗?