代码之家  ›  专栏  ›  技术社区  ›  LondonGuy

如何按NSDate的顺序将对象插入阵列?

  •  0
  • LondonGuy  · 技术社区  · 11 年前

    我有一种方法可以加载用户配置文件库中使用的图像。使用DB中的“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 回复  |  直到 11 年前
        1
  •  1
  •   Wain    11 年前

    你不能指望 imgView.loadInBackground 异步进程开始时的顺序与开始时的相同。

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

    此外,您可能应该限制同时开始的下载次数。尽量不要同时运行4个以上的内容。

        2
  •  0
  •   LondonGuy    11 年前

    这一挑战打击了我的信心,但有了韦恩的解决方案和一些耐心,我坚持了一整天,终于想出了一个似乎非常有效的解决方案。

    代码:

    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
                            }
    

    打印日志:

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