Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅在异步函数完成执行后运行代码_Ios_Swift_Asynchronous_Parse Platform - Fatal编程技术网

Ios 仅在异步函数完成执行后运行代码

Ios 仅在异步函数完成执行后运行代码,ios,swift,asynchronous,parse-platform,Ios,Swift,Asynchronous,Parse Platform,一般来说,我对Swift和Xcode比较陌生,我发现要想弄明白这一点很困难 我正在开发一个利用Parse.com后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,都会在不同的线程上异步完成。然而,代码的其余部分继续在主线程上执行,当它应该从服务器下载的数据尚未下载时,它就会崩溃。我想知道如何调用函数在异步函数完成后运行,这必须针对单独文件中的函数完成 我读到闭包可能会有帮助,但我发现语法非常困难,如果能给出解释,我将不胜感激。但无论如何都会很有帮助 谢谢,您只需在异步回

一般来说,我对Swift和Xcode比较陌生,我发现要想弄明白这一点很困难

我正在开发一个利用
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
可以将函数作为参数;然后在“调用函数”中调用它。但还有很多其他可能的情况。请看这个示例代码:我已经修改了我的答案,以说明接收函数的想法,以便稍后可以调用它。