如何按 NSDate 的顺序将对象插入数组?

How can I insert objects into an array in order of NSDate?

我有一种方法可以加载在用户配置文件的图库中使用的图像。使用我的数据库中的 "updatedPhotoAt" 列按降序加载图像。

"updatedPhotoAt" 列的目的是允许用户设置默认图像。只有当用户滑动图像并点击 "default" 按钮时,此列才会更新。 "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 块引起的。有什么方法可以保持图像的顺序?

您不能指望您开始的 imgView.loadInBackground 个异步进程都以与它们开始时相同的顺序完成。

做一些事情,比如用 NSNull 填充您需要在 pageImages 中使用的所有插槽,然后捕获您应该用块中的每个图像填充的索引并替换该项目索引而不只是追加。

此外,您可能应该限制同时开始的下载数量。尽量不要同时 运行 超过 4 件事。

这个挑战打击了我的信心,但有了上面 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) { [=10=].0 < .0 }
                        println(sortedKeysAndValues)

                        for (k,v) in Array(sortedKeysAndValues).sorted({[=10=].0 < .0}) {
                            println("\(k):\(v)")

                            self.pageImages[k] = v
                        }

打印日志:

[(0, <UIImage: 0x7fd5dac1df60>), (1, <UIImage: 0x7fd5d9455390>), (2, <UIImage: 0x7fd5da86a750>)]

0:<UIImage: 0x7fd5dac1df60>

1:<UIImage: 0x7fd5d9455390>

2:<UIImage: 0x7fd5da86a750>