如何将 UIImages 添加到我的 PFFile 数组,以便如果查询 PFFIle 图像失败,可以通过附加 UIImage 来替换它?

how can I add UIImages to my PFFile array so that if query for a PFFIle images fails, it can be replaced by appending an UIImage?

从 Parse 检索图像并将它们显示在 tableView 上,如果我向下滚动 tableView,应用程序崩溃并给我 "fatal error: Array index out of range"

行数由 "messagesArray"

中的消息数给出

我认为问题是在查询中,如果我没有在指针中找到图像,我会说 "append to the PFFile array this standard UIImage of mine called "logo" " 所以当我向下滚动时,imagesArray 和 messagesArray 的计数不匹配.

如何将 UIImages 添加到我的 PFFile 数组,以便在查询 PFFIle 图像失败时,可以通过附加 UIImage 来替换它?

有些人告诉我对 dispatch_async(dispatch_get_main_queue()) {}

中的图像进行单独查询

但主查询本身就是这样调用的。

我有这个数组:

var picturesArray : [PFFile] = []

cellForRowAtIndexPath 我有:

self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in

            if error == nil {
                let image = UIImage(data: imageData!)
                cell.senderProfileImage?.image = image

            } else {

                print("plan B")
                cell.senderProfileImage?.image = UIImage(named: "logo")

            }

        }

在我的查询中,我可以通过查询带有指向 _Users 的指针的 "sender" 列来检索发件人的姓名。我有:

if let theName = singleObject.objectForKey("sender")?.objectForKey("first_name") as? String {
                        // this retrieves names from pointer "sender" in "Messages"
                        self.sendersArray.append(theName) //populate the array with names
                    } else {
                        if let messageSender = singleObject["senderNickname"] as? String {
                            self.sendersArray.append(messageSender)
                        }
                    }

                    if let profilePicture = singleObject.objectForKey("sender")?.objectForKey("profile_picture") as? PFFile {

                    self.picturesArray.append(profilePicture)

                    } else {
                        //I think this is the problem:
                        print("no image found in pointer to users")
                        self.picturesArray.append(UIImage(named: "logo"))
                    }

解决方案:

目前,还需要修复 错误(希望 Apple 和 Parse 迟早会解决它们)

//very new, it's ok
                    if let theName = singleObject.objectForKey("sender")?.objectForKey("first_name") as? String {
                        // this retrieves names from pointer "sender" in "Messages"
                        self.sendersArray.append(theName) //populate the array with names
                    } else {
                        if let messageSender = singleObject["senderNickname"] as? String {
                            self.sendersArray.append(messageSender)
                        }
                    }



                    //very new : this fix fatal error: Array index out of range
                    if let profilePicture = singleObject.objectForKey("sender")?.objectForKey("profile_picture") as? PFFile {

                    self.picturesArray.append(profilePicture)

                    } else {
                        //I think this is the problem:
                        print("no image found in pointer to users")
//                        self.picturesArray.append(UIImage(named: "logo"))
                        let imageData:NSData = UIImagePNGRepresentation(UIImage(named: "logo")!)!
                        self.picturesArray.append(PFFile(data: imageData))
                    }

 //this fixes the crash related to different number of rows and images
        if indexPath.row < picturesArray.count {
            self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in

                if error == nil {
                    let image = UIImage(data: imageData!)
                    cell.senderProfileImage?.image = image
                }

            }
        } else {
//            cell.senderProfileImage?.image = UIImage(named: "logo")
            print("no foto!")
        }

您的应用程序正在崩溃,因为您的 table 视图单元格多于 picturesArray

中的图片

在使用 picturesArray[x]

之前检查是否 indexPath.row < picturesArray.count
if indexPath.row < picturesArray.count {
    self.picturesArray[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in

        if error == nil {
            let image = UIImage(data: imageData!)
            cell.senderProfileImage?.image = image
        }

    }
} else {
    cell.senderProfileImage?.image = UIImage(named: "logo")
}

编辑:

如果您想将带有徽标图像的 PFFile 附加到 picturesArray 中,您可以执行以下操作

let imageData:NSData = UIImagePNGRepresentation(UIImage(named: "imagename")!)!
self.picturesArray.append(PFFile(data: imageData))

而不是

self.picturesArray.append(UIImage(named: "logo"))

解释:

此处 self.picturesArray.append(UIImage(named: "logo")) 您试图将 UIImage 对象添加到仅接受 PFFile 对象的数组,正如您在此处声明的那样:var picturesArray : [PFFile] = []

您需要实例化一个新的 PFFile 并向其添加一个 UIImage,但是 PFFile 初始化器只接受 NSData 进行存储。

因此,要将 UIImage 转换为 NSData,您可以使用 UIImagePNGRepresentation,然后使用图像数据实例化 PFFile