如何对Firebase';s iOS SDK?
这是我的模型如何对Firebase';s iOS SDK?,ios,swift,firebase,Ios,Swift,Firebase,这是我的模型 messagesRef = Firebase(url: "https://"+CONSTANTS.FirebaseDB+".firebaseio.com/messages/1:1000") messagesRef.queryLimitedToLast(5).observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in self.message_list.append(snapshot)
messagesRef = Firebase(url: "https://"+CONSTANTS.FirebaseDB+".firebaseio.com/messages/1:1000")
messagesRef.queryLimitedToLast(5).observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in
self.message_list.append(snapshot) // it works.
});
});
我的代码有效——它获取最后5条消息(8-12条)
但是,如果我有一个函数查询接下来的5条消息(2-6条),该怎么办?有一个起点和偏移量。我怎么能对此提出质疑
messagesRef = Firebase(url: "https://"+CONSTANTS.FirebaseDB+".firebaseio.com/messages/1:1000")messagesRef
.queryOrderedByKey()
.queryStartingAtValue(5)
.queryEndingAtValue(10)
.observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in self.message_list.append(snapshot) });
这有点像是在黑暗中拍摄的,但根据这里的文档,它似乎应该可以工作:关于花费太多时间,我已经弄明白了,下面是解决方案。这是Objective-C代码,您可以将其转换为swift。 调用下面的函数进行分页
- (void)loadMoreMessages {
if (!lastMessageKey) {
// Loading messages first time
[[[msgsReference queryOrderedByKey] queryLimitedToLast:K_MESSAGES_PER_PAGE] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
if (snapshot.exists) {
for (FIRDataSnapshot *child in snapshot.children) {
NSMutableDictionary *dict = [child.value mutableCopy];
[dict setObject:child.key forKey:@"id"];
[messages addObject:dict];
}
lastMessageKey = [[snapshot.children.allObjects firstObject] key];
NSLog(@"%@", messages);
}
}];
}
else {
// Paging started
[[[[msgsReference queryOrderedByKey] queryLimitedToLast:K_MESSAGES_PER_PAGE + 1] queryEndingAtValue:lastMessageKey] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
if (snapshot.exists) {
NSInteger count = 0;
NSMutableArray *newPage = [NSMutableArray new];
for (FIRDataSnapshot *child in snapshot.children) {
// Ignore last object because this is duplicate of last page
if (count == snapshot.childrenCount - 1) {
break;
}
count += 1;
NSMutableDictionary *dict = [child.value mutableCopy];
[dict setObject:child.key forKey:@"id"];
[newPage addObject:dict];
}
lastMessageKey = [[snapshot.children.allObjects firstObject] key];
// Insert new messages at top of old array
NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [newPage count])];
[messages insertObjects:newPage atIndexes:indexes];
NSLog(@"%@", messages);
}
}];
}
}
下面是您需要的对象的描述:
#define K_MESSAGES_PER_PAGE 50 // A macro defining the numbers in one request
msgsReference // Firebase database messages node reference I'm also attaching the screenshot of my db structure for make you more clear
lastMessageKey // Is a NSString object which store the first key of last page
messages // Is a NSMutableArray storing the result
祝你好运!!(y)
Swift 3.x
func fetchEarlierMessages(chatGroupId: String, messageKey: String, completion: @escaping ([Message]?) -> ()) {
previousMessageRef = root.child("messages").child(chatGroupId)
messageValueHandle = previousMessageRef.queryOrderedByKey().queryLimited(toLast: 10).queryEnding(atValue: messageKey).observe(.value, with: { snapshot in
var messages: [Message] = []
for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
guard var item = child.value as? [String: AnyObject] else { return }
item["message_id"] = child.key as AnyObject
if let message = self.parseMessage(snapshot: child) {
messages.append(message)
}
}
messages.removeLast()
completion(messages)
})
}
这里的“parseMessage”函数是我的自定义函数,用于将快照转换为消息模型,您可以使用自己的。消息键是您在初始firebase调用中加载的最早消息的键 Swift 2017
我想为firebase的分页任务提供一个尽可能优雅的解决方案。此方法在初始化和加载更多数据时调用:
var items: [ItemEntity] = []
var theEndOfResults = false
var lastLoadedItem: ItemEntity? {
return items.last
}
func loadItems() {
let isLoadingMore = lastLoadedItem != nil
Decorator.showStatusBarLoader()
self.databaseReference
.child("items")
.queryOrdered(byChild: "date")
.queryEnding(atValue: isLoadingMore ? lastLoadedItem!.date.stringValue : Date.distantFuture.stringValue)
.queryLimited(toLast: 5)
.observeSingleEvent(of: .value) { snapshot in
var items = self.array(from: snapshot)
.map { ItemEntity(parentKey: $0.parentKey, dictionary: $0.dict) }
self.theEndOfResults = (self.lastLoadedItem == items.last) // prevent loading when it's no more items
if isLoadingMore { items.removeFirst() } // removing as the firebase sending a repeated one
self.items.append(contentsOf: items)
self.reloadData()
}
}
在控制器中重新加载数据的功能
override func reloadData() {
tableV.reloadData()
refreshControl.endRefreshing()
tableV.loadControl?.endLoading()
Decorator.hideStatusBarLoader()
}
当用户到达tableView的末尾时调用此函数
@objc public func loadMore() {
guard self.theEndOfResults == false else { tableV.loadControl?.endLoading(); return }
self..loadItems()
}
从快照生成数组
func数组(来自快照:DataSnapshot)->[ParseResult]{
变量项=[ParseResult]()
如果让快照=snapshot.children.allObjects为?[DataSnapshot]{
用于管理单元快照{
如果让postDictionary=snap.value作为字典{
items.append((snap.key,postDictionary))
}
}
}
打印(“startAt()和endAt())修饰符还没有解决?iOS库没有这些方法。firebase util库支持分页:。实现的核心在此处可用:。虽然库仅在JavaScript中可用,但所使用的方法应该可以很容易地转移到firebase的iOS SDK。如果您的密钥确实像屏幕一样顺序nshot似乎表明,@kpie suggest的方法也应该起作用。但请注意,在分布式/多用户系统中,这种顺序键通常是个坏主意,因为/当多个用户/客户端可能同时向数组添加项时。请看,iOS当然有查询方法,甚至还有介绍它们的指南:这是因为他的kEY是数字。否则你会怎么做?如何降序?@nodebase检查我的答案。这会有帮助。@TheTiger,一旦添加到模型中的数组中,你就可以反转。ei.array.insert[DL Data],位于:array.count)回答很好。这应该被接受为答案。什么是lastMessageKey?如何在lastMessageKey中存储最后一页的第一个键?@HimaliShah这是一个NSString
对象,我们需要分配的值在代码中已经提到。检查这一行lastMessageKey=[[snapshot.children.allObjects firstObject]键]
对于所有“朋友”的“提要”,您将如何进行此操作?目前,我正在收集所有朋友的id,然后在firebase.child(id).child(userposts)上请求
,但我不知道如何进行分页here@DavidSeek考虑<代码> ChasyXYZ 是您的<代码>朋友< /代码>和<代码>消息<代码> >代码>用户帖子< /代码>这不是一个分页功能——因为重新加载Table视图时,它将再次加载Table视图中的100个元素——只需加载新的元素即可。