我试图从Parse加载图像以在集合视图中显示它们,并且订单有时不会出现。通常情况下,第一张图片会正确显示,但后续图像不会按照至少25%的时间排出。
我已经查找了其他答案,并且我已经尝试过所有类似的事情" orderbyascending","制作字典"但仍然没有运气。
我有Parse类,叫做#34; Fhooder"和"项目"他们是相关的。
if PFUser.currentUser() != nil {
let user = PFUser.currentUser()!
let query = PFQuery(className: "Fhooder")
let id = (user.valueForKey("fhooder")?.objectId)! as String
query.getObjectInBackgroundWithId(id) { (fhooder: PFObject?, error: NSError?) -> Void in
if error == nil && fhooder != nil {
let relation = fhooder!.relationForKey("items")
let query2 = relation.query()
query2!.orderByAscending("createdAt")
query2!.findObjectsInBackgroundWithBlock({ (items: [PFObject]?, error2: NSError?) -> Void in
if error2 == nil && items != nil {
var index = items!.count
for item in items! {
let pic = item["photo"] as! PFFile
let name = item["itemName"] as! String
pic.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
if (error == nil) {
let picture = UIImage(data: imageData!)
self.itemPictures[index] = picture
let counter = self.arrItemNames.count - 1
if index == counter {
self.collectionView.reloadData()
}
index++
}
})
if index != 0 {
self.arrItemNames.append(name)
index--
}
}
}
})
}
else {
}
}
}
}
这是我的收藏视频
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collCell2", forIndexPath: indexPath) as! ManageCollectionViewCell
cell.foodImage.image = self.itemPictures[indexPath.item]
return cell
}
有人可以帮助我吗?
答案 0 :(得分:1)
这是我的修订版。为了简单起见,我摆脱了索引,将itemPictures从字典更改为UIImage数组,让Ray的建议每次重新加载,并将所有内容放在getDataInBackgroundWithBlock下以消除任何时间同步错误。但是,图像在创建日期之前仍然没有按顺序排列。真正奇怪的是它以正确的顺序加载的时间是2/3。
var itemPictures : [UIImage] = []
var arrItemNames : [String] = []
if PFUser.currentUser() != nil {
let user = PFUser.currentUser()!
let query = PFQuery(className: "Fhooder")
let id = (user.valueForKey("fhooder")?.objectId)! as String
query.getObjectInBackgroundWithId(id) { (fhooder: PFObject?, error: NSError?) -> Void in
if error == nil && fhooder != nil {
let relation = fhooder!.relationForKey("items")
let query2 = relation.query()
query2!.orderByAscending("createdAt")
query2!.findObjectsInBackgroundWithBlock({ (items: [PFObject]?, error2: NSError?) -> Void in
if error2 == nil && items != nil {
for item in items! {
let pic = item["photo"] as! PFFile
pic.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
if (error == nil) {
let name = item["itemName"] as! String
let picture = UIImage(data: imageData!)
self.itemPictures.append(picture)
self.arrItemNames.append(name)
self.collectionView.reloadData()
}
})
}
}
})
}
else {
}
}
}
答案 1 :(得分:1)
您的代码正在遭受金字塔地狱"嵌套异步调用时会得到。它非常难以遵循流程,并且很难调试。我建议您重新考虑调用的结构,或者使用框架为代码引入类似Promise的结构。由于Parse正在使用Bolts框架,因此您已经安装了此框架。并且它也有相当详细的记录,here。
您的代码可能如下所示:
var itemPictures : [UIImage] = []
var arrItemNames : [String] = []
if PFUser.currentUser() != nil {
let user = PFUser.currentUser()!
let query = PFQuery(className: "Fhooder")
let id = (user.valueForKey("fhooder")?.objectId)! as String
query.getObjectInBackgroundWithId(id).continueWithBlock {
(task: BFTask!) -> BFTask in
let fhooder = task.result as! PFObject
let relation = fhooder.relationForKey("items")
let query2 = relation.query()
return query2.findObjectsInBackground()
}.continueWithBlock {
(task: BFTask!) -> BFTask in
let items = task.result as! [PFObject]
// Do what you need with the objects here...
}
}
那就是说,您可能不想等到所有图像都被下载,所以我建议每个单元格负责异步下载自己的图片然后代码会在照片完成后更新每个单元格下载。你可以通过谷歌搜索找到这方面的教程。
答案 2 :(得分:0)
在不知道index
是什么的情况下,我的猜测是,当你在getDataInBackgroundWithBlock
中增加index
时就会遇到问题。
它是异步的,因此{{1}}仅在响应到达时递增。