我在原生 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。我在这里错过了什么吗?