从分析查询块返回UIImage数组

我不能从这个函数返回[UIImage?]返回。 getDataInBackgroundWithBlock不会让我设置一个返回值,而不是Void in 。 但是,该块会在迭代时添加到iconArray 。 但是一旦在块之外,数组又是空的。 您将在下面的代码中看到数组所在的注释,并且不能正确打印。

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

 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 } } 

当你的函数声明块在后台执行时(在一个asynchronous线程上,这意味着它将在后台加载,但也会继续该函数的其余部分,从而返回一个空的数组。

要解决这个问题,你应该在后台为你的块使用一个完成处理程序。

 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) } } 

虽然以上代码未经testing应该工作

for循环中的asynchronous数据检索已被replace,以支持同步调用以简化项目