运行 异步函数执行完毕后的代码
Run code only after asynchronous function finishes executing
总的来说,我对 Swift 和 Xcode 比较陌生,我发现在尝试解决这个问题时遇到了很多困难。
我正在开发一个利用 Parse.com
后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,它都是在不同的线程上异步完成的。然而,其余代码继续在主线程上执行,并且当它应该从服务器获得的数据尚未下载时崩溃。我想知道如何在异步函数完成后将函数调用到 运行,并且必须对单独文件中的函数执行此操作。
我读到闭包可能对此有帮助,但我发现那里的语法非常困难,非常感谢解释。但任何方式都会非常有帮助。
谢谢
好吧,您只需在异步回调的末尾调用函数即可。那就是异步回调结束的时候——异步回调中的其他一切都结束了!所以,例如:
func myMethod() {
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION!
})
// ... code ...
}
如果问题是你不知道调用什么函数,你可以配置你周围的函数/对象,这样别人就可以hand 你的函数就是你在上面我说 "call the function" 的地方调用的函数。
例如:
func myMethod(f:() -> ()) { // we receive the function as parameter
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION, by saying:
f()
})
// ... code ...
}
扩展 Matt 的回答,您可以使 myMethod 成为一个将闭包作为参数的方法:
func myMethod(completionBlock: (result: String) -> ())
{
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
completionBlock(thing)
})
// ... code ...
}
总的来说,我对 Swift 和 Xcode 比较陌生,我发现在尝试解决这个问题时遇到了很多困难。
我正在开发一个利用 Parse.com
后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,它都是在不同的线程上异步完成的。然而,其余代码继续在主线程上执行,并且当它应该从服务器获得的数据尚未下载时崩溃。我想知道如何在异步函数完成后将函数调用到 运行,并且必须对单独文件中的函数执行此操作。
我读到闭包可能对此有帮助,但我发现那里的语法非常困难,非常感谢解释。但任何方式都会非常有帮助。
谢谢
好吧,您只需在异步回调的末尾调用函数即可。那就是异步回调结束的时候——异步回调中的其他一切都结束了!所以,例如:
func myMethod() {
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION!
})
// ... code ...
}
如果问题是你不知道调用什么函数,你可以配置你周围的函数/对象,这样别人就可以hand 你的函数就是你在上面我说 "call the function" 的地方调用的函数。
例如:
func myMethod(f:() -> ()) { // we receive the function as parameter
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION, by saying:
f()
})
// ... code ...
}
扩展 Matt 的回答,您可以使 myMethod 成为一个将闭包作为参数的方法:
func myMethod(completionBlock: (result: String) -> ())
{
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
completionBlock(thing)
})
// ... code ...
}