从Parse

时间:2015-08-17 20:03:13

标签: ios swift parse-platform

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

}

2 个答案:

答案 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")

注意: 如果您害怕阻止主队列,请打开一个新线程来执行此类操作