分页直到结束

Pagination until the end

我有一个使用 PubNub 作为聊天服务的应用程序。登录后,我想下载所有历史消息。不幸的是,PubNub 已将消息的最大数量限制为 100,因此您必须使用分页来下载所有消息,直到没有更多消息到达为止。 我想要实现的工作流程如下:

  1. 加载前 100 条消息
  2. 处理它们(存储在应用程序中)
  3. 加载接下来的 100 封邮件
  4. 等等..

他们提供的方法如下:

client.historyForChannel(channel, start: nil, end: nil, includeTimeToken: false)
{ (result, status) in
      // my code here...
}

问题是,在 "my code here..." 部分,我需要再次调用该函数(使用 startDate)以加载接下来的 100 条消息。但是要再次调用该函数,我需要设置一个与调用该函数的完成块完全相同的完成块。这是一个无限循环..我怎样才能以不同的方式解决这个问题?非常感谢!

PubNub 历史分页示例代码

所有SDK都有实现历史分页的示例代码。请参考PubNub Swift SDK Storage API Reference History Paging section.

这是内联的代码:

分页历史响应: 您可以通过传递 0 或有效时间标记作为参数来调用该方法。

// Pull out all messages newer then message sent at 14395051270438477.
let date = NSNumber(value: (14395051270438477 as CUnsignedLongLong));
self.historyNewerThen(date, onChannel: "history_channel", withCompletion:  { (messages) in
     
    print("Messages from history: \(messages)")
})
 
 
func historyNewerThen(_ date: NSNumber, onChannel channel: String, 
                      withCompletion closure: @escaping (Array<Any>) -> Void) {
         
    var msgs: Array<Any> = []
    self.historyNewerThen(date, onChannel: channel, withProgress: { (messages) in
         
        msgs.append(contentsOf: messages)
        if messages.count < 100 { closure(msgs) }
    })
}
     
private func historyNewerThen(_ date: NSNumber, onChannel channel: String, 
                              withProgress closure: @escaping (Array<Any>) -> Void) {
     
    self.client?.historyForChannel(channel, start: date, end: nil, limit: 100, 
                                   reverse: false, withCompletion: { (result, status) in
                                     
        if status == nil {
             
            closure((result?.data.messages)!)
            if result?.data.messages.count == 100 {
                 
                self.historyNewerThen((result?.data.end)!, onChannel: channel, 
                                      withProgress: closure)
            }
        }
        else {
             
            /**
             Handle message history download error. Check 'category' property
             to find out possible reason because of which request did fail.
             Review 'errorData' property (which has PNErrorData data type) of status
             object to get additional information about issue.
              
             Request can be resent using: [status retry];
             */
        }
    })
}

请参阅其他 SDK 语言特定实现中的相同部分。