异步 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 的很棒的教程。本教程使用下载操作异步加载图像,依赖项将在网络请求完成时过滤照片。
Apple 也有一个很棒的 sample project,它使用异步网络请求操作。
异步调用,就其本质而言,不会运行完成然后调用下一件事。他们 return 立即,在要求他们完成的任务甚至还没有安排之前。
您需要一些方法让第二个任务等待第一个任务完成。
NauralInOva 给出了一个很好的解决方案:使用一对 NSOprations 并使它们相互依赖。您还可以将这两个操作放入串行队列中,第二个操作在第一个操作完成后才会开始。
但是,如果这些调用在另一个线程上触发异步操作,它们可能仍会 return 并且操作队列可能会触发第二个操作(getContacts()
调用而不等待 signIn()
完成。
另一个选项是设置第一个回调函数:
signIn( callback: {
getContacts()
}
第三种选择是设计一个接受委托的登录对象,登录对象将在登录完成后调用委托的 signInComplete
方法。
这是一件很常见的事情,大多数网络 API 都是为此而构建的 "out out of the box." 如果 Google API 没有,我会感到震惊有一些设施来处理这个。
您使用的是什么 Google 框架?你能指出它的文档吗?
我需要进行异步调用,以便仅在第一个方法之后调用第二个方法 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 的很棒的教程。本教程使用下载操作异步加载图像,依赖项将在网络请求完成时过滤照片。
Apple 也有一个很棒的 sample project,它使用异步网络请求操作。
异步调用,就其本质而言,不会运行完成然后调用下一件事。他们 return 立即,在要求他们完成的任务甚至还没有安排之前。
您需要一些方法让第二个任务等待第一个任务完成。
NauralInOva 给出了一个很好的解决方案:使用一对 NSOprations 并使它们相互依赖。您还可以将这两个操作放入串行队列中,第二个操作在第一个操作完成后才会开始。
但是,如果这些调用在另一个线程上触发异步操作,它们可能仍会 return 并且操作队列可能会触发第二个操作(getContacts()
调用而不等待 signIn()
完成。
另一个选项是设置第一个回调函数:
signIn( callback: {
getContacts()
}
第三种选择是设计一个接受委托的登录对象,登录对象将在登录完成后调用委托的 signInComplete
方法。
这是一件很常见的事情,大多数网络 API 都是为此而构建的 "out out of the box." 如果 Google API 没有,我会感到震惊有一些设施来处理这个。
您使用的是什么 Google 框架?你能指出它的文档吗?