【问题标题】:Return UIImage Array From Parse Query Block从解析查询块返回 UIImage 数组
【发布时间】:2015-06-26 10:24:14
【问题描述】:

我无法从此函数获得 [UIImage?] 返回。 getDataInBackgroundWithBlock 不允许我设置除Void in 以外的返回值。但是,该块在迭代时确实会添加到iconArray。但是一旦在块之外,数组又是空的。您将在 cmets 下方的代码中看到数组正确打印和未正确打印的位置。

调用确实连接到数据库,所有数据都在流动。它只是返回那个挂断的数组。

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

}

}

【问题讨论】:

  • @Wain 我不同意那个重复,这个问题在另一个异步调用中的 for 循环中有一个异步调用,这将与您提供的链接不同。
  • @milo526,原理相同,但我同意内部循环增加了额外的复杂性。可以说应该提取内部循环...

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


【解决方案1】:

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

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

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 循环中的异步数据检索已被替换为同步调用以简化项目

【讨论】:

  • 这个问题与我无关,不管有没有可能,你都不应该这样做;) Dispatch_async 应该主要用于完成块内的 UI 更改
  • @spacemonkey 我会收回那个答案,我认为它也可以在异步调用中的 for 循环中使用。请查看编辑后的答案
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2020-01-02
  • 2016-04-09
相关资源
最近更新 更多