【问题标题】:Sendbird SyncManager channel pagination issueSendbird SyncManager 频道分页问题
【发布时间】:2021-04-23 11:45:32
【问题描述】:

我在原生 iOS 应用程序中使用Sendbird 发送聊天消息。他们有一个附加组件SyncManager。它将频道列表和消息缓存在手机本地以提供离线支持。

我正在尝试使用 SyncManager 的集合对频道列表进行分页。这是我的代码 sn-p:

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。我在这里有什么遗漏吗?

【问题讨论】:

    标签: sendbird sendbird-ios sendbird-syncmanager


    【解决方案1】:

    @sunil 目前,您每次调用 fetchNextPage 时都在构建一个新查询。您需要维护原始查询才能使 hasNext 为真。

    【讨论】:

    • 不,我不是。 'guard let query = query' 不会创建新的查询。它只是确保“查询”存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多