我有一种方法可以加载图库中用于用户个人资料的图像。使用" updatedPhotoAt"以降序加载图像。我的数据库中的列。
" updatedPhotoAt"的目的列是允许用户设置默认图像。只有当用户滑动图像并点击"默认"时才会更新此列。按钮。其中" updatedPhotoAt"列的最新日期是默认图像。
这是我的代码:
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
for object in objects as Array {
var imgDate = object["updatedPhotoAt"] as NSDate
println("1: \(imgDate)")
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
//error alert
} else {
self.pageImages.append(image)
var imgDate = object["updatedPhotoAt"] as NSDate
println("2: \(imgDate)")
正如您所知,当我查询数据库时,我确保使用" updatedPhotoAt"确保结果以降序返回。柱。在我的块中,我打印此列日期值,以便我可以看到事情是否正常工作。
最初是:
1:2015-01-30 12:15:54 +0000
1:2015-01-22 10:23:00 +0000
1:2015-01-14 10:19:00 +0000
然而,在imgView块中,他们失去了订单:
2:2015-01-22 10:23:00 +0000
2:2015-01-14 10:19:00 +0000
2:2015-01-30 12:15:54 +0000
这意味着我的默认图像只是偶然显示,图像总是以随机顺序显示在用户照片库中(图库是一个滚动视图,允许用户水平滚动图像。默认图像应该始终在列表)。
我发现问题是由imgView块引起的。有没有办法可以保留图像的顺序?
答案 0 :(得分:1)
您不能指望您开始的imgView.loadInBackground
异步流程按照与它们开始时相同的顺序完成。
执行类似填充pageImages
NSNull
中需要使用的所有插槽的操作,然后捕获您应该使用块中的每个图像填充的索引并替换该索引处的项目而不仅仅是附加。
除此之外,您应该限制同时启动的下载次数。尽量不要一次运行超过4件事。
答案 1 :(得分:0)
这一挑战让我充满了信心,但是凭借Wain的解决方案以及一些耐心,我一整天坚持不懈,终于想出了一个似乎运作良好的解决方案。
<强>代码:强>
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
//index to assign to imgview tag to keep track of image in block
var idx = -1
var imageDictionary = Dictionary<Int, UIImage>()
for object in objects as Array {
idx++
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.tag = idx
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
} else {
//store images in array for counting later
self.pageImages.append(image)
//store image index and image as dictionary value
imageDictionary[imgView.tag] = image
}
if objects.count == self.pageImages.count {
let sortedKeysAndValues = sorted(imageDictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues)
for (k,v) in Array(sortedKeysAndValues).sorted({$0.0 < $1.0}) {
println("\(k):\(v)")
self.pageImages[k] = v
}
Println log:
[(0, <UIImage: 0x7fd5dac1df60>), (1, <UIImage: 0x7fd5d9455390>), (2, <UIImage: 0x7fd5da86a750>)]
0:<UIImage: 0x7fd5dac1df60>
1:<UIImage: 0x7fd5d9455390>
2:<UIImage: 0x7fd5da86a750>