我正在开发一个功能类似于Instagram的iOS应用。我已经在个人资料页面上成功完成了分页,但是始终无法在家庭供稿中获得正确的结果。
目标-按日期的时间顺序获取帖子。最新的应该优先。帖子来自我关注的人。首先获取3,然后向下滚动则获取另外3。
示例Firebase实时数据库结构。
用户表
users
-uid
-name
-emailID
帖子表
posts
-uid
-pid
-title
-date
-pid2
-title
-date
Controller.swift
我得到了特定用户的所有uid 然后我尝试从这些uid中获取帖子
fileprivate func fetchPosts() {
guard let uid = Auth.auth().currentUser?.uid else { return }
Database.fetchUserWithUID(uid: uid) { (user) in
self.fetchPostsWithUser(user: user)
}
}
fileprivate func fetchPostsWithUser(user: User) {
let uid = user.uid
let ref = Database.database().reference().child("posts").child(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: 3).observeSingleEvent(of: .value, with: { (snapshot) in
guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.reverse()
print("coint is , ", allObjects.count)
if allObjects.count < 2 {
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)
}
}
扩展名
extension Database {
static func fetchUserWithUID(uid: String, completion: @escaping (User) -> ()) {
Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
guard let userDictionary = snapshot.value as? [String: Any] else { return }
let user = User(uid: uid, dictionary: userDictionary)
completion(user)
}) { (err) in
print("Failed to fetch user for posts:", err)
}
}
此代码有效,但很奇怪。我没有按正确的顺序安排这些职位。它总是给我输出随机排序的帖子。
我该怎么办?
答案 0 :(得分:0)
您以随机顺序获取帖子的原因是因为observeSingleEvent(of: )
从数据库中获取数据是先到先得的基础。因此,在Firebase UI中,它可能是基于创建的字母顺序,但这并不意味着它在获取时将显示在视图中。您必须使用queryOrderedByKey
或(queryOrderedByValue
)并按键/值对其进行排序(如果您按childByAutoID
创建帖子,则会自动从最早的(顶部)到创建时最新。
答案 1 :(得分:0)
在self.posts.append和reloadData之间添加以下行将解决您的问题。
tf.saved_model.simple_save(
keras.backend.get_session(),
'./simple_save/',
inputs={t.name.split(':')[0]:t for t in model.input},
outputs={t.name.split(':')[0]:t for t in model.outputs},
legacy_init_op=tf.tables_initializer())
答案 2 :(得分:0)
1)。从firebase提取前5个数据,这里我的表名是“ Tweets”
let FetchtweetRef = FIRDatabase.database().reference()
FetchtweetRef.child("Tweets").queryOrderedByKey().queryLimited(toLast: 5).observe(FIRDataEventType.value, with: { (tweets) in
for tweet in tweets.children{
let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
// Store object in Array
}
FetchtweetRef.child("Tweets").removeAllObservers()
})
2)。在“获取下5个数据”在您的表视图上滚动之后。
// Here find last object key from array.
let key = self.tweetArray[self.tweetArray.count].key
let FetchtweetRef = FIRDatabase.database().reference()
FetchtweetRef.child("Tweets").queryOrderedByKey().queryEnding(atValue: key).queryLimited(toLast: 6).observe(.value, with: {(tweets) in
for tweet in tweets.children {
let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
// Stored object in Array
}
FetchtweetRef.child("Tweets").removeAllObservers()
})