Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用firebase&;敏捷的_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 使用firebase&;敏捷的

Swift 使用firebase&;敏捷的,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我正在尝试从firebase数据库中为用户跟随到我的收藏视图的帖子分页。目前只有4篇文章被添加到集合视图中,当我向下滚动时不再加载 我尝试过改变最初加载的帖子数量,但没有成功 fileprivate func fetchFollowingUserIds() { guard let uid = Auth.auth().currentUser?.uid else { return } Database.database().reference().child("user-follo

我正在尝试从firebase数据库中为用户跟随到我的收藏视图的帖子分页。目前只有4篇文章被添加到集合视图中,当我向下滚动时不再加载

我尝试过改变最初加载的帖子数量,但没有成功

fileprivate func fetchFollowingUserIds() {

    guard let uid = Auth.auth().currentUser?.uid else { return }
    Database.database().reference().child("user-following").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in

        guard let userIdsDictionary = snapshot.value as? [String: Any] else { return }

        userIdsDictionary.forEach({ (key, value) in
            Database.fetchUserWithUID(uid: key, completion: { (user) in
                self.fetchPostsWithUser(user: user)
            })
        })

    }) { (err) in
        print("Failed to fetch following user ids:", err)
    }
}

var posts = [Post]()
fileprivate func fetchPosts() {
    guard let uid = Auth.auth().currentUser?.uid else { return }

    Database.fetchUserWithUID(uid: uid) { (user) in
        self.fetchPostsWithUser(user: user)
    }
}

var isFinishedPaging = false
fileprivate func fetchPostsWithUser(user: User) {

    self.collectionView?.refreshControl?.endRefreshing()

    let ref = Database.database().reference().child("posts").child(user.uid)

    var query = ref.queryOrdered(byChild: "creationDate")

    if posts.count > 0 {
        let value = posts.last?.creationDate.timeIntervalSince1970
        query = query.queryEnding(atValue: value)
    }

    query.queryLimited(toLast: 4).observeSingleEvent(of: .value, with: { (snapshot) in

        guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

        allObjects.reverse()

        if allObjects.count < 4 {
            self.isFinishedPaging = true
        } else {
            self.isFinishedPaging = false
        }
        if self.posts.count > 0 && allObjects.count > 0 {
            allObjects.removeFirst()
        }

        allObjects.forEach({ (snapshot) in
            guard let dictionary = snapshot.value as? [String: Any] else { return }
            var post = Post(user: user, dictionary: dictionary)

            post.id = snapshot.key

            self.posts.append(post)
        })

        self.collectionView?.reloadData()

    }) { (err) in
        print(err)
    }
}
fileprivate func fetchfolloweruserids(){
guard let uid=Auth.Auth().currentUser?.uid else{return}
Database.Database().reference().child(“用户跟随”).child(uid).observeSingleEvent(of:.值,其中:{(快照))位于
guard let userIdsDictionary=snapshot.value为?[String:Any]else{return}
中的userIdsDictionary.forEach({(键,值)
Database.fetchUserWithUID(uid:key,completion:{(user)in)
self.fetchPostsWithUser(用户:用户)
})
})
}){(错误)在
打印(“获取以下用户ID失败:”,错误)
}
}
var posts=[Post]()
fileprivate func fetchPosts(){
guard let uid=Auth.Auth().currentUser?.uid else{return}
数据库中的fetchUserWithUID(uid:uid){(user)
self.fetchPostsWithUser(用户:用户)
}
}
var isFinishedPaging=false
fileprivate func fetchPostsWithUser(用户:用户){
self.collectionView?.refreshControl?.endRefresh()
设ref=Database.Database().reference().child(“posts”).child(user.uid)
var query=ref.queryOrdered(byChild:“creationDate”)
如果posts.count>0{
让值=posts.last?.creationDate.timeintervalencesince1970
query=query.queryEnding(atValue:value)
}
queryLimited(toLast:4).observeSingleEvent(of:.值,其中:{(快照))位于
guard var allObjects=snapshot.children.allObjects作为?[DataSnapshot]else{return}
allObjects.reverse()
如果allObjects.count小于4{
self.isFinishedPaging=true
}否则{
self.isFinishedPaging=false
}
如果self.posts.count>0&&allObjects.count>0{
allObjects.removeFirst()
}
中的allObjects.forEach({(快照)
guard let dictionary=snapshot.value as?[String:Any]else{return}
var post=post(用户:用户,字典:字典)
post.id=snapshot.key
self.posts.append(post)
})
self.collectionView?.reloadData()
}){(错误)在
打印(错误)
}
}

我只是想在用户向下滚动时加载更多帖子。

可能存在查询问题或潜在的逻辑问题。假设您希望向用户展示帖子,最新的帖子位于列表顶部,并允许用户向下滚动查看以前的帖子

让我们用一个例子来说明这两个问题:

我们没有你的结构,但保持它超级简单,假设你的文章有以下结构和创建日期

post_0
   creation_date: "20180101"
post_1
   creation_date: "20180102"
post_2
   creation_date: "20180103"
post_3
   creation_date: "20180104"
post_4
   creation_date: "20180105"
post_5
   creation_date: "20180106"
post_6
   creation_date: "20180107"
post_7
   creation_date: "20180108"
这是您的初始查询,order by creation date,它将从5日到8日加载最后4篇文章

var query = ref.queryOrdered(byChild: "creationDate")
然后,后续查询按创建日期排序,但结束值不是创建日期,而是自创建日期1970年以来经过的时间

我猜你只是想加载接下来的4篇文章。当这个在数组中时,它们看起来是这样的:

20180108
20180107
20180106
20180105
一种方法是从您的数据源获取最后一篇文章的creationDate(这将是最早的文章)

然后按creationDate查询,以最后一篇文章的创建日期结束,得到总共5篇文章,然后删除最后一篇

20180101
20180102
20180103
20180104
20180105
然后反过来

20180105
20180104
20180103
20180102
20180101
并移除第一个

20180104
20180103
20180102
20180101
像这样的

let lastD = self.postsArray.last
self.postsArray = []

let postsRef = self.ref.child("posts")
let queryRef = postsRef.queryOrdered(byChild: "creation_date")
let queryEndingRef = queryRef.queryEnding(atValue: lastD)
let queryLimitedRef = queryEndingRef.queryLimited(toLast: 5)
queryLimitedRef.observeSingleEvent(of: .value, with: { snapshot in
    guard var thisArray = snapshot.children.allObjects as? [DataSnapshot] else { return }

    thisArray.reverse()
    thisArray.removeFirst()

    for post in thisArray {
        let theDate = post.childSnapshot(forPath: "creation_date").value as! String
        self.postsArray.append(theDate)
    }
})

这可能是一个愚蠢的问题,但我从哪里获得
self.postsArray.last
呢?@CodyHost这是我用作tableView数据源的类数组的名称。在您的问题中,您似乎使用var posts=[Post]()作为数据源数组。我在
self.postsArray.append(theDate)
中遇到一个错误,它说
无法将“String”类型的值转换为预期的参数类型“Post”
我是否只删除as!字符串?@CodyHost这是正确的。如果您注意到,在我的示例中,我只将发布日期作为字符串存储在postsArray中。我这样做是为了代码的简单和简洁。您的数组可能会存储一个Post类,该类包含的数据可能不止是一个日期字符串,因此您需要相应地修改我的代码;读取节点,用子数据构建一个类,并将Post存储在数组中,而不是原始字符串。也许我的结构不清楚,所以我更新了答案的开头,以显示存储创建日期的潜在结构。
20180104
20180103
20180102
20180101
let lastD = self.postsArray.last
self.postsArray = []

let postsRef = self.ref.child("posts")
let queryRef = postsRef.queryOrdered(byChild: "creation_date")
let queryEndingRef = queryRef.queryEnding(atValue: lastD)
let queryLimitedRef = queryEndingRef.queryLimited(toLast: 5)
queryLimitedRef.observeSingleEvent(of: .value, with: { snapshot in
    guard var thisArray = snapshot.children.allObjects as? [DataSnapshot] else { return }

    thisArray.reverse()
    thisArray.removeFirst()

    for post in thisArray {
        let theDate = post.childSnapshot(forPath: "creation_date").value as! String
        self.postsArray.append(theDate)
    }
})