首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Firebase的iOS SDK上执行分页查询?

如何在Firebase的iOS SDK上执行分页查询?
EN

Stack Overflow用户
提问于 2015-04-10 19:42:06
回答 4查看 9K关注 0票数 25

这是我的模型。

代码语言:javascript
复制
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条),该怎么办?有一个开始和偏移。我怎样才能质疑这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-12 23:38:56

代码语言:javascript
复制
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) });

这是在黑暗中拍摄的,但它似乎应该基于这里的文档https://www.firebase.com/docs/ios-api/Classes/Firebase.html#//api/name/queryStartingAtValue工作。

票数 20
EN

Stack Overflow用户

发布于 2016-08-17 08:34:30

花了太多的时间,我想出了办法,这就是解决办法。这是目标-C代码,你可以把它转换成swift。为分页目的调用下面的函数。

代码语言:javascript
复制
- (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);
            }
        }];
    }
}

下面是您需要的对象的描述:

代码语言:javascript
复制
#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)

票数 19
EN

Stack Overflow用户

发布于 2017-09-28 06:55:59

Swift 3.x

代码语言:javascript
复制
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‘函数是我的自定义函数,可以将快照转换为消息模型,您可以使用自己的。消息密钥是您在初始防火墙调用中加载的最早消息的密钥。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29569504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档