asynchronousswift 3

我需要进行asynchronous调用,以便第二个方法只在第一个方法完成后调用。两种方法都是networking调用。 像这样的东西:

signIn() getContacts() 

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

这是我试过的:

 let queue = DispatchQueue(label: "com.app.queue") queue.async { signIn() getContacts() } 

asynchronous调用,就其性质而言,不会跑完成然后再调用下一个东西。 他们在被要求完成的任务被安排之前立即返回。

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

NauralInOva给出了一个很好的解决scheme:使用一对NSOprations并使它们相互依赖。 你也可以把2个操作放到一个串行队列中,第二个操作在第一个完成之前不会开始。

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

另一个选项是设置第一个函数来进行callback:

 signIn( callback: { getContacts() } 

第三种方法是devise一个接受委托的login对象,一旦login完成,login对象会在委托上调用signInComplete方法。

这是一个很常见的事情,大多数networkingAPI都是为“开箱即用”而构build的。 如果Google API没有处理这个function的设施,我会感到震惊的。

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

你正在寻找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的很好的教程。 本教程使用下载操作asynchronous加载图像的依赖关系,将完成networking请求过滤照片。

Apple还有一个很好的示例项目 ,它使用asynchronousnetworking请求进行操作。