问题描述
我在原生 iOS 应用中使用 Sendbird 发送聊天消息。他们有一个附加组件 SyncManager。它将频道列表和消息缓存在手机本地以提供离线支持。
我正在尝试使用 SyncManager 的集合对频道列表进行分页。这是我的代码片段:
func fetchCollection() {
self.query = SBDGroupChannel.createMyGroupChannelListQuery()
self.query?.order = .latestLastMessage
self.query?.limit = 20
self.collection = SBSMChannelCollection(query: query)
self.collection?.delegate = self
}
func fetchNextPage() {
// Problem: The `query.hasNext` is never set to `false`!
guard let query = query,query.hasNext else { return }
collection?.fetch { error in
if let error = error {
self.log("Error: \(error)",level: .debug)
return
}
// Do nothing,as the collection delegate would be notified to the delegate.
}
}
func collection(_ collection: SBSMChannelCollection,didReceiveEvent action: SBSMChannelEventAction,channels: [SBDGroupChannel]) {
switch action {
case .insert:
datasource.insertChannels(channels)
case .update:
datasource.moveChannels(channels)
case .remove:
datasource.deleteChannels(channels)
case .move:
datasource.moveChannels(channels)
case .clear:
datasource.clearChannels()
case .none:
dispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
default:
assertionFailure("Undefine action")
dispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}
}
问题是 query.hasNext
从未设置为 false
。我也试过检查 collection.query.hasNext
,但也总是有 true
。
请注意,Sendbird 的基本 SDK 确实将 query.hasNext
设置为 false,因此我可以确定查询是否有下一页,我应该再次调用。我想使用 SyncManager 进行分页。
他们的 SyncManager 示例应用发送下一页请求而不检查是否有下一页可用,因此每次用户滚动到底部时,他们都会调用 API。我在这里遗漏了什么吗?
解决方法
@sunil 目前,您每次调用 fetchNextPage 时都在构建一个新查询。您需要维护原始查询以使 hasNext 为真。