从Parse查询

时间:2016-02-13 00:17:41

标签: ios swift parse-platform

基本上我试图显示3个用户,我从_User类查询以下内容:username,profilePicture&名称。

之后我想查询他们从帖子课上发布的最后一张照片。

以下是我设置代码的方法:

        let userQuery = PFQuery(className: "_User")
        userQuery.limit = 3
        userQuery.addDescendingOrder("createdAt")
        userQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in
            if error == nil {

                self.profilePicArray.removeAll(keepCapacity: false)
                self.usernameArray.removeAll(keepCapacity: false)
                self.fullnameArray.removeAll(keepCapacity: false)
                self.uuidArray.removeAll(keepCapacity: false)

                for object in objects! {

                    self.profilePicArray.append(object.valueForKey("profilePicture") as! PFFile)
                    self.usernameArray.append(object.valueForKey("username") as! String)
                    self.fullnameArray.append(object.valueForKey("firstname") as! String)
                    self.uuidArray.append(object.valueForKey("uuid") as! String)
                }

                let imageQuery = PFQuery(className: "Posts")
                imageQuery.whereKey("username", containedIn: self.usernameArray)
                imageQuery.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in
                    if error == nil {

                        self.lastPicArray.removeAll(keepCapacity: false)

                        for object in objects! {
                            self.lastPicArray.append(object.valueForKey("image") as! PFFile)
                        }
                        self.collectionView.reloadData()

                    } else {
                        print(error!.localizedDescription)
                    }
                })

            } else {
                print(error!.localizedDescription)
            }
        })
    }

但是,当我运行它时,它没有显示正确的图像给用户显示...我无法绕过它,它已经让我疯了几个小时了!!

2 个答案:

答案 0 :(得分:0)

由于您使用findObjectsInBackgroundWithBlock,因此可能会因数据传输而导致不同的时间成本。在后台运行的线程很难控制。因此,imageQuery objects中的图片顺序与usernameArray不同。或者findObjectsInBackgroundWithBlock不保证在设置密钥的情况下将以相同的顺序提取数据。不是100%肯定这个。

但是尝试将图像提取过程放在第一个for object in objects!循环中。它可能能够解决您的问题。

为了从creeperspeak中排序答案,您应该能够在第一个循环中从imageQuery类获取用户名,就像object.valueForKey("username")一样。然后将它们与self.usernameArray匹配。

答案 1 :(得分:0)

后台线程对于获取图像并不是一个问题,但是您的图像查询未设置为以任何特定顺序返回图像,也不会限制每个用户将返回多少张照片(除非您将它设置为使Post对象每个用户只能容纳一个帖​​子。您可以通过几种不同的方式处理此问题,但最简单的方法可能是以可预测的顺序对对象数组进行排序,使用用户名作为排序键,然后当您获得图像时,可以按相同顺序对它们进行排序在将它们放入驱动collectionView的数组之前,基于它们的用户名属性。

另一个注意事项 - 您希望将mbr_person电话重新放回主线程,否则会在不可预测的时间发生。