【问题标题】:How can I insert objects into an array in order of NSDate?如何按 NSDate 的顺序将对象插入到数组中?
【发布时间】:2015-03-29 23:35:18
【问题描述】:

我有一种方法可以加载用于用户个人资料库的图像。使用我的数据库中的“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 块引起的。有什么办法可以保持图片的顺序吗?

【问题讨论】:

  • 问题是loadInBackground,图像的接收顺序与请求的顺序不同。这是意料之中的,您必须围绕它进行编程。
  • 我建议按原样插入。然后,当您想显示该数组的内容时,只需使用正确的谓词对其进行排序。

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


【解决方案1】:

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

使用NSNull 填充pageImages 中您需要使用的所有插槽,然后,捕获您应该使用块中的每个图像填充的索引并替换该索引处的项目,而不仅仅是追加。

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

【讨论】:

  • 我不完全明白如何做到这一点。我在循环之外添加了“var idx = -1”。然后在循环内“idx++ self.pageImages.append(NSNull())”。我有 3 个索引代表 3 个图像。 0、1 和 2。我不理解您关于捕获我应该使用每张图像填充的索引的建议。请您进一步解释一下吗?
  • 只需使用block中的idx替换NSNull entry
【解决方案2】:

这个挑战打击了我的信心,但凭借上面 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
                        }

打印日志:

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

0:<UIImage: 0x7fd5dac1df60>

1:<UIImage: 0x7fd5d9455390>

2:<UIImage: 0x7fd5da86a750>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多