我无法从此函数返回[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
}
}
答案 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循环中的异步数据检索已被替换,有利于同步调用以简化项目