Sendbird SyncManager 频道分页问题

问题描述

我在原生 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 为真。