我正在Swift中编写一个使用Parse作为后端的应用程序。用户可以发布要解析的图像,并在用户登录时显示在collectionView中。
我遇到的新问题是从当前用户的解析中检索我的所有图像时,图像全部无序显示。实际上,几乎每次检索图像时,它们的顺序都略有不同。我试着查看人们遇到这个问题的其他帖子,但他们似乎没有做到这一点。
以下是我的代码,用于检索用户(当前用户)的所有图片帖子:
func retrieveAllImagesForUserId(userId:String){
self.arrayOfUserPosts.removeAll()
let query = PFQuery(className: "ImagePost")
query.whereKey("UserId", equalTo: userId)
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock {
(object:[PFObject]?, error:NSError?) -> Void in
if ( error != nil ){
print(error?.localizedDescription, error?.userInfo)
} else {
for temp: PFObject in object! {
let username: String = temp["Username"] as! String
let userId: String = temp["UserId"] as! String
let description: String = temp["ImageDescription"] as! String
let imageId: String = temp.objectId!
let file: PFFile = temp["Image"] as! PFFile
file.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let imageData = imageData {
let retrievedImage = UIImage(data: imageData)
self.imagePost = ImagePost.init(
image: retrievedImage!,
userId: userId,
imageId: imageId,
description: description,
username: username)
self.arrayOfUserPosts.append(self.imagePost!)
NSNotificationCenter.defaultCenter().postNotificationName("retrievedPost", object: nil)
}
}
}
}
}
}
}
我做的第一件事是删除所有对象以避免任何可能的重复发生,可能来自之前登录到同一设备或类似设备的用户。
对于发布的每张图片,我还发布了一个列,其中包含发布该图像的用户objectId。这样,我可以查询所述密钥等于当前用户objectId的位置。
我正在对orderByDescending(" createdAt")进行额外的查询,因此新图像将显示在我的集合视图的顶部。
我的ImagePost类是一个非常简单的类,用于用对象填充区域,它看起来像这样:
class ImagePost { var postedImage:UIImage? var userId:String? var imageId:String? var description:String? var username:String?
init(image:UIImage, userId:String, imageId:String, description: String, username: String ) {
self.postedImage = image
self.userId = userId
self.imageId = imageId
self.description = description
self.username = username
}
}
当检索数据时,我将新的ImagePost对象附加到我的数组,这是我用来填充我的collectionView并发送通知以重新加载集合视图的数组。
我真的不明白为什么我会遇到这个问题所以突然之间几乎以他们选择的任何顺序检索图像。任何帮助将不胜感激。
如果你知道objective-c中的解决方案但不是swift也会有所帮助。
谢谢你, 罗布
答案 0 :(得分:1)
我使用Parse集成了类似的东西。
您最初不需要获取所有图像。您可以使用第三方库SDWebImageCache
在需要或缓存时下载图像。
将postedImage
类型设为PFFile
并直接指定imageFile。无需获取imageData。
在updatedAt
课程中使用另一个名为ImagePost
的密钥。从Parse
查询对象时无需使用谓词。保存updatedAt
课程的ImagePost
时间。现在,您可以直接将数据附加到arrayOfUserPosts
。
完成循环后,您可以对数组进行排序并将其分配给self.arrayOfUserPosts
。
然后在tableView的dataSource tableView:cellForRowAtIndexPath:
方法中,您可以执行类似的操作,
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:file.url] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
// Any custom view initialisation if needed.
}
其中imageView是图像的显示视图,file是PFFile类型的对象,代表图像。这是一个Objective-C代码。类似于Swift的语法。