我在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()
中返回查询之前删除重复项。
答案 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