Ios 仅在异步函数完成执行后运行代码
一般来说,我对Swift和Xcode比较陌生,我发现要想弄明白这一点很困难 我正在开发一个利用Ios 仅在异步函数完成执行后运行代码,ios,swift,asynchronous,parse-platform,Ios,Swift,Asynchronous,Parse Platform,一般来说,我对Swift和Xcode比较陌生,我发现要想弄明白这一点很困难 我正在开发一个利用Parse.com后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,都会在不同的线程上异步完成。然而,代码的其余部分继续在主线程上执行,当它应该从服务器下载的数据尚未下载时,它就会崩溃。我想知道如何调用函数在异步函数完成后运行,这必须针对单独文件中的函数完成 我读到闭包可能会有帮助,但我发现语法非常困难,如果能给出解释,我将不胜感激。但无论如何都会很有帮助 谢谢,您只需在异步回
Parse.com
后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,都会在不同的线程上异步完成。然而,代码的其余部分继续在主线程上执行,当它应该从服务器下载的数据尚未下载时,它就会崩溃。我想知道如何调用函数在异步函数完成后运行,这必须针对单独文件中的函数完成
我读到闭包可能会有帮助,但我发现语法非常困难,如果能给出解释,我将不胜感激。但无论如何都会很有帮助
谢谢,您只需在异步回调结束时调用函数即可。这就是异步回调结束的时候——异步回调中的所有其他内容都结束了!例如:
func myMethod() {
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION!
})
// ... code ...
}
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 ...
}
如果问题是您不知道要调用什么函数,您可以配置您周围的函数/对象,以便有人可以将一个函数交给您,然后您可以在上面我说的“调用函数”的地方调用该函数
例如:
func myMethod() {
// ... code ...
somebody.doSomethingWith(someObject, asynchronousCallback: {
(thing, otherThing) in
// ... do whatever
// --> CALL THE FUNCTION!
})
// ... code ...
}
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中,函数是一等公民,因此函数A可以将函数B交给函数C,后者可以存储函数B。然后,函数C或访问存储函数B的其他函数可以调用函数B。这就是所有回调的工作方式。当你说
UIView.animateWithDuration(){…}
时,这就是你要交给Cocoa的东西——它将调用这个函数来执行动画。另请参阅我的书:然而,如何选择在架构上实现它取决于您。在上面的示例中,myMethod
可以将函数作为参数;然后在“调用函数”中调用它。但还有很多其他可能的情况。请看这个示例代码:我已经修改了我的答案,以说明接收函数的想法,以便稍后可以调用它。