1

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

4

1 回答 1

0

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

于 2021-01-20T20:08:56.100 回答