![](/img/trans.png)
[英]How can I observe Firebase child value changes in multiple nodes in Swift?
[英]In Firebase, how can I query the most recent 10 child nodes?
我正在使用childByAutoId()
来生成我的孩子。 每个孩子看起来像:
{
user_id: 1
}
我希望得到最近添加的10个,按时间DESC排序。 最简单的方法是什么?
答案是您需要使用一些反向逻辑,并将每个节点中的时间戳键:值对存储为负值。 我省略了user_id:1以保持答案更清晰。
这是Firebase结构
"test" : {
"-KFUR91fso4dEKnm3RIF" : {
"timestamp" : -1.46081635550362E12
},
"-KFUR9YH5QSCTRWEzZLr" : {
"timestamp" : -1.460816357590991E12
},
"-KFURA4H60DbQ1MbrFC1" : {
"timestamp" : -1.460816359767055E12
},
"-KFURAh15i-sWD47RFka" : {
"timestamp" : -1.460816362311195E12
},
"-KFURBHuE7Z5ZvkY9mlS" : {
"timestamp" : -1.460816364735218E12
}
}
以及这是如何写到Firebase的; 我只是使用IBAction按钮来写出几个节点:
let testRef = self.myRootRef.childByAppendingPath("test")
let keyRef = testRef.childByAutoId()
let nodeRef = keyRef.childByAppendingPath("timestamp")
let t1 = Timestamp
nodeRef.setValue( 0 - t1) //note the negative value
和读取它的代码
let ref = self.myRootRef.childByAppendingPath("test")
ref.queryOrderedByChild("timestamp").queryLimitedToFirst(3).observeEventType(.ChildAdded, withBlock: { snapshot in
print("The key: \(snapshot.key)") //the key
})
我声明了一个小函数来返回当前的时间戳
var Timestamp: NSTimeInterval {
return NSDate().timeIntervalSince1970 * 1000
}
和输出
The key: -KFURBHuE7Z5ZvkY9mlS
The key: -KFURAh15i-sWD47RFka
The key: -KFURA4H60DbQ1MbrFC1
如您所见,它们的顺序相反。
注意事项:
在这方面,您也可以像往常一样读取数据并将其添加到数组中,然后对数组进行降序排序。 这会给客户带来更多的努力,如果你拥有10,000个节点可能不是一个好的解决方案。
我假设你的数据实际上是这样的:
someDataSet: {
longUID-1: {
timeCreated: 9999999999, // (seconds since the javascript epoch)
user_id: 1
},
longUID-2: {
timeCreated: 1111111111,
user_id: 2
},
longUID-3: {
timeCreated: 3141592653,
user_id: 3
}
}
您可以通过在for循环或任何其他方法中多次调用Firebase.push({user_id: ###, timeCreated: ###})
来自动执行此操作。 也许你是在网页上添加新闻报道,但你只希望你的用户看到最新的故事--- IDK。 但问题的答案是使用Firebase的ref.orderByChild()
和ref.limitToLast()
。
var ref = new Firebase("<YOUR-FIREBASE-URL>.firebaseio.com/someDataSet");
//the "/someDataSet" comes from the arbitrary name that I used up above
var sortedRef = ref.orderByChild('timeCreated');
//sort them by timeCreated, ascending
sortedRef.limitToLast(2).on("child_added", function(snapshot){
var data = snapshot.val();
console.log(data);
/* do something else with the data */
});
//The console would look like this
// Object {timeCreated: 9999999999, user_id: 1}
// Object {timeCreated: 3141592653, user_id: 3}
之所以发生这种情况,是因为该程序首先使用timeCreated
值最大的子timeCreated
,然后是第二个(值)第二个...另外请注意,当您按子进行排序时,longUID没有任何意义,其他值也没有(在这种情况下为user_id) )
这是以下文档:
代码: ref.queryOrderedByKey().queryLimitedToLast(10)
可用于获取最新的10个数据。 但是,默认情况下这是升序。
或者,您可以通过订购数据
ref.orderByChild("id").on("child_added", function(snapshot) {
console.log(snapshot.key());
});
默认情况下,这也会显示升序。 将其更改为降序有点棘手。 我建议将ID乘以-1,如下所示,然后对它们进行排序。
var ref= new Firebase("your data");
ref.once("value", function(allDataSnapshot) {
allDataSnapshot.forEach(function(dataSnapshot) {
var updatedkey = -1 * dataSnapshot.key();
ref.update({ element: { id: updatedkey}});
});
});
这两个SO页面也可能对您有用,请检查:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.