从解析查询块返回UIImage数组

时间:2015-04-19 20:10:24

标签: ios swift for-loop parse-platform return

我无法从此函数返回[UIImage?]。 getDataInBackgroundWithBlock不允许我设置Void in以外的返回值。但是,该块在迭代时会添加到iconArray。但是一旦在块外,阵列再次变空。您将在下面的代码中看到数组所做的注释和不能正确打印的注释。

呼叫确实连接到数据库,所有数据都在流动。它只是返回挂起的数组。

class callData {


func queryImages() -> [UIImage?] {

    var iconArray: [UIImage?] = []

    var query: PFQuery = PFQuery(className: "QuestionMaster")
    query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

        for object in objects! {

            let imageFiles = object["questionImage"] as! PFFile

            imageFiles.getDataInBackgroundWithBlock({
                (imageData: NSData?, error: NSError?) -> Void in
                if (error == nil) {

                    let image = [UIImage(data: imageData!)]
                    iconArray += image        //adds item to array correctly
                }

                println(iconArray) //prints correct array here

            }) //getDataInBackgroundWithBlock close

            println(iconArray) //does not print correct array here

        } //for-loop close

    }

    return iconArray //returns empty array

}

}

1 个答案:

答案 0 :(得分:2)

正如您的函数所述,该块在后台执行(在异步线程上)。 这意味着它将在后台加载,但也将继续该函数的其余部分,从而返回一个空数组。

要解决此问题,您应该在后台使用块的完成处理程序。

func queryImages(onComplete:(images: [UIImage?])-> Void){
    var iconArray: [UIImage?] = []
    var query: PFQuery = PFQuery(className: "QuestionMaster")
    query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

    for object in objects! {

        let imageFiles = object["questionImage"] as! PFFile

        let imageData = imageFiles.getData()
        let image = UIImage(data:imageData!)
        iconArray.append(image)

        println(iconArray)
    }
    onComplete(images: iconArray)
    }
}

虽然上面未经测试的代码应该可以使用

for循环中的异步数据检索已被替换,有利于同步调用以简化项目