基本上我试图显示3个用户,我从_User类查询以下内容:username,profilePicture&名称。
之后我想查询他们从帖子课上发布的最后一张照片。
以下是我设置代码的方法:
let userQuery = PFQuery(className: "_User")
userQuery.limit = 3
userQuery.addDescendingOrder("createdAt")
userQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.profilePicArray.removeAll(keepCapacity: false)
self.usernameArray.removeAll(keepCapacity: false)
self.fullnameArray.removeAll(keepCapacity: false)
self.uuidArray.removeAll(keepCapacity: false)
for object in objects! {
self.profilePicArray.append(object.valueForKey("profilePicture") as! PFFile)
self.usernameArray.append(object.valueForKey("username") as! String)
self.fullnameArray.append(object.valueForKey("firstname") as! String)
self.uuidArray.append(object.valueForKey("uuid") as! String)
}
let imageQuery = PFQuery(className: "Posts")
imageQuery.whereKey("username", containedIn: self.usernameArray)
imageQuery.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.lastPicArray.removeAll(keepCapacity: false)
for object in objects! {
self.lastPicArray.append(object.valueForKey("image") as! PFFile)
}
self.collectionView.reloadData()
} else {
print(error!.localizedDescription)
}
})
} else {
print(error!.localizedDescription)
}
})
}
但是,当我运行它时,它没有显示正确的图像给用户显示...我无法绕过它,它已经让我疯了几个小时了!!
答案 0 :(得分:0)
由于您使用findObjectsInBackgroundWithBlock
,因此可能会因数据传输而导致不同的时间成本。在后台运行的线程很难控制。因此,imageQuery
objects
中的图片顺序与usernameArray
不同。或者findObjectsInBackgroundWithBlock
不保证在设置密钥的情况下将以相同的顺序提取数据。不是100%肯定这个。
但是尝试将图像提取过程放在第一个for object in objects!
循环中。它可能能够解决您的问题。
为了从creeperspeak中排序答案,您应该能够在第一个循环中从imageQuery
类获取用户名,就像object.valueForKey("username")
一样。然后将它们与self.usernameArray
匹配。
答案 1 :(得分:0)
后台线程对于获取图像并不是一个问题,但是您的图像查询未设置为以任何特定顺序返回图像,也不会限制每个用户将返回多少张照片(除非您将它设置为使Post对象每个用户只能容纳一个帖子。您可以通过几种不同的方式处理此问题,但最简单的方法可能是以可预测的顺序对对象数组进行排序,使用用户名作为排序键,然后当您获得图像时,可以按相同顺序对它们进行排序在将它们放入驱动collectionView的数组之前,基于它们的用户名属性。
另一个注意事项 - 您希望将mbr_person
电话重新放回主线程,否则会在不可预测的时间发生。