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

时间:2015-01-30 13:17:27

标签: ios cocoa-touch swift uiimageview objective-c-blocks

我有一种方法可以加载图库中用于用户个人资料的图像。使用" 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块引起的。有没有办法可以保留图像的顺序?

2 个答案:

答案 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>