使用getdatainbackground从Iarse中检索多个图像(IOS - Swift)

时间:2018-06-13 20:59:16

标签: ios swift parse-platform

我尝试使用包含一些将添加到数组的字符串和图像的Parse进行查询。数组中的字符串都是正确的顺序,但不是图像。我认为这可能是因为有些图像比其他图像小,因此它们会比预期更早地附加到数组中。有没有办法去节省"数组中的空间是否使图像保持正确的顺序?它可能并不难解决,但我是新手:(谢谢你!

query.findObjectsInBackground (block: { (objects:[PFObject]?, error: Error?) -> Void in
    for object in objects! {
        DispatchQueue.global(qos: .userInteractive).async {
                    // Async background process

                if let imageFile : PFFile = self.bild.append(object.value(forKey: "Bild") as! PFFile) {
                    imageFile.getDataInBackground(block: { (data, error) in
                        if error == nil {
                            DispatchQueue.main.async {
                                // Async main thread

                                let image = UIImage(data: data!)
                                image2.append(image!)

                            }
                        } else {
                            print(error!.localizedDescription)
                        }
                    })
                }


               }
    }
    })

1 个答案:

答案 0 :(得分:0)

您的分析是正确的,请求将以非确定性顺序完成,部分或主要受必须返回的数据量的影响。

使用可将字符串映射到UIImage的可变字典,而不是附加UIImage(或数据)的数组。字符串键的合理选择是PFFile名称。

编辑我不是Swift作家,但我试图在下面表达这个想法(不要依赖它编译,但我认为这个想法很合理)

class MyClass {    
    var objects: [PFObject] = []
    var images: [String: UIImage] = [:]  // we'll map names to images

    fetchObjects() {
        // form the query
        query.findObjectsInBackground (block: { (objects:[PFObject]?, error: Error?) -> Void in
            self.objects = objects
            self.fetchImages()
        })
    }

    fetchImages() {
        for object in self.objects! {
            if let imageFile : PFFile = object["Bild"] as PFFile {
                self.fetchImage(imageFile);
            }
        }
    }

    fetchImage(imageFile: PFFile) {
        imageFile.getDataInBackground(block: { (data, error) in
            if error == nil {
                self.images[imageFile.name] = UIImage(data: data!)
                // we can do more here: update the UI that with image that has arrived
                // determine if we're done by comparing the count of images to the count of objects
            } else {
                // handle error
            }
        }
    }
}

这将在后台获取图像,并使用字典将它们与文件名相关联。 OP代码没有解释self.bild是什么,但我认为它是检索到的PFFiles的实例数组。我用images实例var。

替换了它

图像文件顺序由对象集合维护:获取第N个图像,获取第N个对象,得到它" Bild"属性,PFFile的名称是图像字典的关键。

var n = // some index into objects
var object : PFObject = self.objects[n]
var file : PFFile = object["Bild"]
var name : String = file.name
var nthImage = self.images[name] // is nil before fetch is complete