swift PFQueryTableViewController - 在呈现单元格

时间:2016-01-22 18:21:56

标签: ios swift parse-platform pfquery

我在Parse中有两个类,一个包含用户喜欢的图像细节("喜欢"),第二个类列出跟随其他用户的用户("关注") 。

在我的PFQueryViewController我可以在queryForTable()中创建执行以下操作的查询:

    //get username of users being followed
    let query:PFQuery = PFQuery(className:"Follows")
    query.whereKey("fromUser", equalTo: (PFUser.currentUser()?.username)!)

    //get images of all followed users
    let imageQuery:PFQuery = PFQuery(className: "Liked")
    imageQuery.whereKey("username", matchesKey: "toUser", inQuery: query)

    //get images current user liked
    let userImagesQuery:PFQuery = PFQuery(className: "Liked")
    userImagesQuery.whereKey("username", equalTo: (PFUser.currentUser()?.username)!)

    //combine liked images of following and current user
    let combinedQuery:PFQuery = PFQuery.orQueryWithSubqueries([imageQuery,userImagesQuery])


    if(objects?.count == 0)
    {
        combinedQuery.cachePolicy = PFCachePolicy.CacheThenNetwork
    }

    combinedQuery.orderByDescending("createdAt")


    return combinedQuery

通过查询每个单元格的cellForRowAtIndexPath对象,我可以在imageID中显示用户喜欢的图像和被关注的用户。但是,多个用户可能喜欢相同的图像,因此如果用户和他们关注的人像同一个图像一样,图像将在表格中出现两次。

有没有办法强制查询在找到基于ImageID密钥的副本时忽略对象?

我知道这可以通过执行查询并遍历对象来完成,但是在这种情况下这不会起作用,因为我需要在queryForTable()中返回查询之前删除重复项。

1 个答案:

答案 0 :(得分:1)

我设法通过使用objectsDidLoad()来解决这个问题。这会在将对象发送到表之前捕获它们,因此我能够遍历每个对象并删除任何重复项。

我将所有加载的对象存储到一个新数组中,如果找到重复项,则删除一个对象。然后我在cellForRowAtIndexPath中使对象成为数组中的对应对象。

 override func objectsDidLoad(error: NSError?) {
    super.objectsDidLoad(error)

    displayedImages.removeAll()
    imageObjects = NSMutableArray(array: objects!)

    for item in imageObjects {
        if displayedImages.count == 0 {
            let image = item["imageid"] as! NSNumber
            displayedImages.insert(image, atIndex: 0)
        }else{
            var count = 0
            let image = item["imageid"] as! NSNumber
            for imageToCheck in displayedImages {
                if imageToCheck != image {
                    count++
                }
            }
            if count != displayedImages.count {
                imageObjects.removeObject(item)
            }else{
                displayedImages.insert(image, atIndex: 0)
            }
        }
    }

    self.tableView.reloadData()

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return imageObjects.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! FeedTableViewCell

     if let pfObject:PFObject = self.imageObjects.objectAtIndex(indexPath.row) as? PFObject {

//display images as before