Noob问题在这里,我知道我的代码是非常错误的,但它的工作原理是它检索我需要的3个图像。但是,我想知道从Parse检索多个图像的更好方法。
非常感谢任何帮助!
func retrieveImage() {
var query = PFQuery(className: "Items")
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
let imageObjects = objects as! [PFObject]
for (index, object) in enumerate(imageObjects) {
let thumbnail1 = object["image1"] as! PFFile
let thumbnail2 = object["image2"] as! PFFile
let thumbnail3 = object["image3"] as! PFFile
thumbnail1.getDataInBackgroundWithBlock{(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let image = UIImage(data: imageData!) {
self.itemImages[index] = image
}
}
thumbnail2.getDataInBackgroundWithBlock{(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let image = UIImage(data: imageData!) {
self.itemImages2[index] = image
}
}
}
thumbnail3.getDataInBackgroundWithBlock{(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let image = UIImage(data: imageData!) {
self.itemImages3[index] = image
}
}
}
}
}
}
}
}
答案 0 :(得分:2)
首先,我们想要做一个任意长的异步任务列表,收集他们的结果,并在完成或错误时收到通知。我们通过参数化任务来做到这一点(在这种情况下,要获取其内容的PFFiles是参数),我们将这些参数用作"待办事项列表"。
递归函数执行工作,拾取列表中的第一项,执行异步任务,然后使用列表的其余部分调用自身。空的待办事项清单意味着我们已经完成了。
我试图将答案I referred to here翻译成swift(逐字逐句地学习语言)....
func load(pfFiles: Array<PFFile>, var filling: Dictionary<PFFile, UIImage>, completion: (success: Bool) -> Void) {
completion(success: true)
var count = pfFiles.count
if (count == 0) {
return completion(success: true)
}
var file = pfFiles[0]
var remainder = Array(pfFiles[1..<count])
file.getDataInBackgroundWithBlock{(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let image = UIImage(data: imageData!) {
filling[file.name] = image
self.load(remainder, filling: filling, completion: completion)
}
} else {
completion(success: false)
}
}
}
鉴于这是我的第一次尝试,如果它有效,我会感到有点震惊和高兴,但算法是合理的,并且swift编译并且看起来与我概述的想法相符。以下是如何称呼它......
var pfFiles: Array<PFFile>
for (index, object) in enumerate(imageObjects) {
pfFiles.append(object["image1"])
pfFiles.append(object["image2"])
pfFiles.append(object["image3"])
}
var filling: Dictionary<String, UIImage>
// call the function here
// in the completion assign filling to property
// anytime after, when you have a PFFile like someObject["image2"]
// you use its name to look it up the UIImage in the results dictionary
如果最后一点足够清楚,请告诉我。正如你所看到的,我在快速翻译时失去了动力并使用了伪代码。
答案 1 :(得分:0)
我相信你可以做self.itemImages[index] = thumbnail1.getData()!
如果崩溃,请执行:query.includeKey("image1")
注意: 如果您害怕阻止主队列,请打开一个新线程来执行此类操作