【问题标题】:Firebase -how to paginate based on keys but skip over specific attributes?Firebase - 如何根据键进行分页但跳过特定属性?
【发布时间】:2020-10-29 21:43:13
【问题描述】:

我有一个基于视频的应用程序。有人建议我使用类似于任何其他视频应用程序的视频推荐系统,该系统根据用户观看的内容显示视频。如果用户滚动浏览 50 个视频,其中 20 个与宠物相关(狗、猫等),那么随着用户进一步滚动,他们会看到更多与动物相关的视频,而不是与动物无关的视频。

当我拉帖子时,我会根据快照键从最新到最旧进行分页。每个视频都有一个类似-category: "pets" 的属性,但这与分页的快照键无关。在确定用户更喜欢宠物视频后,我认为是用户页面,如果帖子不包含该属性,请跳过它,但有一个问题。

使用属性的问题是,如果前 50 个视频确定用户更喜欢与宠物相关的视频,因为他们滚动接下来的 200 个视频可能没有宠物属性,这意味着要么跳过所有 200 个视频,要么显示商场。但是如果他们必须滚动浏览所有 200 个,那么推荐系统就没有任何意义了。

如果200之后的50个视频中有10个确实有pets属性,使用下面的分页系统,没有办法跳过所有200个视频并到达后面50个中的下10个(基本上直接跳到keys 201 - 250)。

是否有跳过不包含特定属性的帖子批次?

var snapKey: String?
    
func paginate() {
        
    let postsRef = Database.database().reference().child("posts")
        
    if snapKey == nil {

        postsRef
            .queryOrderedByKey
            .queryLimited(toLast: 20)
            .obsereSingleEvent(of: value, with: (snapshot) {
                    
                guard let firstChild = snapshot.children.allObjects.first as? DataSnapshot else { return }
                    
                for child in snapshot.children.allObjects as! [DataSnapshot] {
                    // each child is a post, get it, fetch and attach user model, append to datasource, reloadData
                }
                    
                self.snapKey = firstChild.key
            })
            
    } else {
            
        postsRef
            .queryOrderedByKey
            .queryEnding(atValue: snapKey!)
            .queryLimited(toLast: 21)
            .obsereSingleEvent(of: value, with: (snapshot) {
                    
                guard let firstChild = snapshot.children.allObjects.first as? DataSnapshot else { return }
                    
                for child in snapshot.children.allObjects as! [DataSnapshot] {
                        
                    // each child is a post, get it, fetch and attach user model, append to datasource, reloadData
                }
                    
                self.snapKey = firstChild.key
            })
    }
}

【问题讨论】:

  • 请编辑问题以将其缩小到一个特定的问题或问题。您在这里至少有三个不同的问题(包括标题中的一个),其中一个与 Stack Overflow 完全无关。
  • 哪一部分是题外话,所以我可以删除它。
  • 标题 - 询问 RTDB 是否合适。这是一个见仁见智的问题。要求其他更合适的问题是题外话,因为它要求对场外资源提出建议。将您的问题集中在手头代码的功能上。
  • 我更新了问题但保持上下文不变

标签: ios swift firebase-realtime-database


【解决方案1】:

是否有跳过不包含特定属性的批次的帖子?

Firebase 实时数据库没有 NOT EQUAL 操作。最接近的等价物是执行两个查询:一个查询值之前的匹配项,另一个查询值之后的匹配项。

所以大致如下:

let query1 = postsRef.queryOrdered(byChild: "category").queryEnding(atValue: "o~")
let query2 = postsRef.queryOrdered(byChild: "category").queryStarting(atValue: "q")

~ 只是最后一个可打印的 ASCII 字符,因此您的第一个查询就在第一个类别以 p 开头的项目之前结束。

【讨论】:

  • 坦率感谢您的帮助,但我真的迷路了,这个让我头疼
猜你喜欢
  • 2014-06-07
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多