Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Swift 迅速关闭的问题_Swift_Parse Platform_Closures - Fatal编程技术网

Swift 迅速关闭的问题

Swift 迅速关闭的问题,swift,parse-platform,closures,Swift,Parse Platform,Closures,我在从闭包中检索数据时遇到问题。我正在调用名为getwallmages的函数,该函数应该返回一个数组。我可以从闭包内部打印数组的内容,但在闭包外部,数组是空的 import Foundation import Parse class WallPostQuery { var result = [WallPost]() func getWallImages() -> [WallPost] { let query = WallPost.query()!

我在从闭包中检索数据时遇到问题。我正在调用名为
getwallmages
的函数,该函数应该返回一个数组。我可以从闭包内部打印数组的内容,但在闭包外部,数组是空的

import Foundation
import Parse

class WallPostQuery {

    var result = [WallPost]()

    func getWallImages() -> [WallPost] { 
        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in    
            if error == nil {     
                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                }
            }
        }

        //this line prints [] ...empty array?
        println(result)
        return self.result
    }
}
问题:
如何从闭包中获取值?

发生的情况是,该方法在闭包执行之前返回

从根本上说,您在管理异步回调的方式上遇到了问题

您需要创建一种从闭包中通知调用方的方法。您可以通过以下方式实现:要求您自己的闭包作为输入参数;使用委托模式;使用通知


每种方法都有其优缺点,这取决于您的具体情况。开始异步数据获取的最简单方法是传入自己的闭包。从那里,如果需要,您可以跳转到另一个模式,例如委托模式。

发生的是,该方法在闭包执行之前返回

从根本上说,您在管理异步回调的方式上遇到了问题

您需要创建一种从闭包中通知调用方的方法。您可以通过以下方式实现:要求您自己的闭包作为输入参数;使用委托模式;使用通知


每种方法都有其优缺点,这取决于您的具体情况。开始异步数据获取的最简单方法是传入自己的闭包。如果需要,您可以从那里跳转到另一个模式,例如委托模式。

这是因为
println(result)
self.results=objects
之前执行。闭包是异步执行的,因此它随后执行。尝试创建一个使用可以从闭包中调用的结果的函数:

var result = [WallPost]()
    func getWallImages() {

        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in

            if error == nil {

                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                    self.useResults(self.result)
                }
            }
        } 
    }

    func useResults(wallPosts: [WallPost]) {
        println(wallPosts)
    }

}
问题的另一个解决方案是创建自己的闭包,以便从该函数返回:

var result = [WallPost]()
    func getWallImages(completion: (wallPosts: [WallPost]?) -> ()) {

        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in

            if error == nil {

                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                    completion(wallPosts: self.result)
                } else {
                    completion(wallPosts: nil)
                }
            } else {
                completion(wallPosts: nil)
            }
        } 
    }

    func useResults(wallPosts: [WallPost]) {
        println(wallPosts)
    }

}

这是因为
println(result)
self.results=objects
之前执行。闭包是异步执行的,因此它随后执行。尝试创建一个使用可以从闭包中调用的结果的函数:

var result = [WallPost]()
    func getWallImages() {

        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in

            if error == nil {

                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                    self.useResults(self.result)
                }
            }
        } 
    }

    func useResults(wallPosts: [WallPost]) {
        println(wallPosts)
    }

}
问题的另一个解决方案是创建自己的闭包,以便从该函数返回:

var result = [WallPost]()
    func getWallImages(completion: (wallPosts: [WallPost]?) -> ()) {

        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in

            if error == nil {

                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                    completion(wallPosts: self.result)
                } else {
                    completion(wallPosts: nil)
                }
            } else {
                completion(wallPosts: nil)
            }
        } 
    }

    func useResults(wallPosts: [WallPost]) {
        println(wallPosts)
    }

}

我认为println(result)的后一个在前面被调用,因为findobjectsinbackgroundithblock是在后台执行的,顾名思义

因此,您可以通过以下方式确认结果:

import Foundation
import Parse

class WallPostQuery {

    var result = [WallPost]() {
        didSet {
            println(result)
        }
    }

    func getWallImages() { 
        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in    
            if error == nil {     
                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                }
            }
        }
    }
}

我认为println(result)的后一个在前面被调用,因为findobjectsinbackgroundithblock是在后台执行的,顾名思义

因此,您可以通过以下方式确认结果:

import Foundation
import Parse

class WallPostQuery {

    var result = [WallPost]() {
        didSet {
            println(result)
        }
    }

    func getWallImages() { 
        let query = WallPost.query()!

        query.findObjectsInBackgroundWithBlock { objects, error in    
            if error == nil {     
                if let objects = objects as? [WallPost] {
                    self.result = objects
                    //This line will print the three PFObjects I have
                    println(self.result)
                }
            }
        }
    }
}