我在一个原生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的basic SDK确实将query.hasNext设置为false,因此我可以确定查询是否有下一页,并且我应该进行另一个调用。我想使用SyncManager进行分页。
他们的SyncManager示例应用程序发送下一个页面请求,而不检查是否有下一个页面可用,所以每次用户滚动到底部时,他们都会调用API。我是不是漏掉了什么?
发布于 2021-01-21 04:08:56
@sunil现在,您每次调用fetchNextPage时都在构建一个新的查询。您需要维护原始查询,才能使hasNext为真。
https://stackoverflow.com/questions/65787044
复制相似问题