【问题标题】:swift PFQueryTableViewController - remove duplicate objects before presenting cellsswift PFQueryTableViewController - 在呈现单元格之前删除重复的对象
【发布时间】:2016-01-22 18:21:55
【问题描述】:

我在 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

这适用于我能够通过查询每个单元格的对象的imageIDcellForRowAtIndexPath 中显示用户喜欢的图像以及被关注的用户。但是,多个用户可以点赞同一张图片,因此如果用户和他们关注的人喜欢同一张图片,则该图片将在表格中出现两次。

有没有办法强制查询在根据ImageID 键找到重复对象时忽略对象?

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

【问题讨论】:

    标签: ios swift parse-platform pfquery


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多