Swift 4:使用数组中的数据进行分页,以便在用户滚动时进行 API 调用

2024-02-11

背景

在我的应用程序中,我存储了一堆对象 ID。我使用这些 ID 进行批量 API 调用。 API 将每次调用限制为 10 个 ID 号。该数据呈现在 UITableView 上。用户可以添加和删除对象,这会在数据库中添加或删除对象 ID。

我使用 Firestore 数据库来存储我这边的对象 ID。

目前的实施

这是我到目前为止所实现的,但在添加和删除对象时它会导致应用程序崩溃。我无法弄清楚如何正确处理这些情况以及这是否是做这样的事情的正确模式。

  1. 获取用于进行 API 调用的对象 ID
var objectIds: [String] = []
var chunkedObjectIds: [[String]] = []
var objects: [Array] = []
var offset: Int = 0

override func viewDidLoad() {
    super.viewDidload()

    getObjectIds()

 }

func getObjectIds() {
    // get objects IDs and store then in objectIds from the Firestore database
    // setup the .addSnapshotLister so the query is triggered whenever there is a change in the data on Firestore for the collection

    return chunkedObjectIds

    // when finished, get the first 10 objects from the 3rd party API

    fetchObjects()

}
  1. 获取对象 Ids 数组,分成数组数组(共 10 个)并对前 10 个进行 API 调用
func fetchObjects() {

     // split objectIds array in array of arrays, in lots of 10
     // chunkedObjectIds is set here

     // request the objects for the first 10 ID numbers

    Alamofire.request(… parameter with first 10 object ids …) (objects) in {

        // save objects

        // increment the offset
        offset += 1
    }

}
  1. 在 UITableView 单元格上呈现数据

  2. 使用以下方法从 3rd 方 API 加载更多数据:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        let lastRow = objects.count 

        var parameters = [String: Any]()

        if indexPath.row == lastRow {
            if !(offset == self.chunkedObjectIds.count) {

                // process the next batch from the array
                parameters["id-numbers"] = self.chunkedObjectIds[offset].map{String($0)}.joined(separator: ",")

                Alamofire.request(… paramaters: parameters) { (objects) in
                    for item in 0..<objects.count {
                        let indexPath = IndexPath(row: item + self.objects.count, section: 0)
                        self.paths.append(indexPath)
                    }
                    self.objects.append(contentsOf: objects)
                    self.tableView.beginUpdates()
                    self.tableView.insertRows(at: self.paths, with: .automatic)
                    self.tableView.endUpdates()
                    self.paths.removeAll()
                    self.offset += 1
                }
            }
        }
    }
  1. 添加或删除对象:

    • 从 Firestore 数据库中添加或删除对象 ID
    • objectIds、chunkedObjectIds、offset 和对象被清除
    • 监听器触发数据读取并重复该过程

问题与问题

这对于加载初始数据非常有效。但是添加时会发生重复(有时会崩溃)。删除时应用程序会因超出范围异常而崩溃。

这是首先使用的正确模式吗?如果是这样,我在第一次加载后处理案例时缺少什么,特别是新对象 ID 的添加和删除。

Edit

我根据评论中的反馈更改了实现。那么现在,流程是这样的:

  1. 设置侦听器以从 Firestore 获取数据
  2. 循环访问 Firestore 中的对象 id,当计数器
  3. 从第 3 方 API 获取对象
  4. 我一直用willDisplay cell触发更多数据加载的方法 - 它似乎比scrollDidEnd method.

所以现在应用程序不再崩溃了。 firestore 侦听器存在一些问题,但我会将其作为一个单独的问题发布。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 4:使用数组中的数据进行分页,以便在用户滚动时进行 API 调用 的相关文章

随机推荐

  • 如何在一定时间后重试功能请求

    如果用户数据为空 如何让它重试发送尝试 最多重试 2 次 10 秒后重试 1 次 public class UserHandler private List users new ArrayList public void addUser u
  • 绕过 requiredfieldvalidator

    我有一个网络表单 上面有验证器 当用户按下提交按钮时 验证器可以很好地工作 但是 当用户按下注销按钮时 验证器会停止该按钮的工作 关于如何解决这个问题有什么建议吗 您需要使用CausesValidation按钮上的属性
  • nf_conntrack_helper注册未注册端口返回错误

    我有以下代码从内核 3 18 取消注册和注册 sip conntrack static void nf conntrack sip fini void int i j for i 0 i lt ports c i for j 0 j lt
  • 在没有 gitosis/gitolite 的情况下通过 SSH 运行“安全”git 服务器?

    是否可以通过 ssh 运行 git 服务器 使用authorized keys and command 限制仅访问 git 存储库 而不使用 gitosis gitolite 是的 分配git shell http www kernel o
  • 获取 Youtube 数据 API 的 403 禁止错误

    我在对 YouTube 数据 API 进行 API 调用时收到 403 禁止错误 我尝试生成不同类型的密钥 Web 浏览器 服务器等 钥匙不受限制 我尝试从服务器和 Chrome 的邮递员拨打电话 请求 URL 和响应如下 https ww
  • 访问 AVRO GenericRecord (Java/Scala) 中的嵌套字段

    我有一个带有嵌套字段的 GenericRecord 当我使用genericRecord get 1 它返回一个包含嵌套 AVRO 数据的对象 我希望能够像这样访问该对象genericRecord get 1 get 0 但我不能 因为 AV
  • 在 woocommerce 中隐藏折扣信息而不取消优惠券

    我在 Woocommerce 购物车中使用优惠券进行计算 它会自动为总额添加折扣 以便可以将正确的金额发送到支付网关 我想向访客隐藏有关此优惠券 折扣的所有信息 Problem 我发现的唯一方法 见下文 隐藏优惠券字段 行 总计 和消息 但
  • COBOL:GDG 文件描述符 (FD) 可以引用多代吗?

    我有一个程序可以读取 GDG 文件并将数据移动到工作存储 我很想知道是否可以使用对文件定义的引用对多代 GDG 重复此过程 也许有一种方法可以在文件定义上使用下标 我的想法是必须有一种方法将不同的文件定义移动到引用变量中以访问文件 基于建议
  • 如何检测设备是否支持鼠标?

    我目前使用以下测试 取自 Modernizr 来检测触摸支持 function is touch device var bool if ontouchstart in window window DocumentTouch document
  • 我的树形图的 Arangodb 自定义过滤器/访问者

    我有一个带有两个边定义的图 如下所示 isDepartment organisation gt organisation hasAccess user gt organisation 组织嵌套在树中 无循环 有多个顶级组织 没有任何传入is
  • 使用 shell 脚本从 sql 脚本中选择列到局部变量中

    如何将从表中检索到的列值存储到 shell 脚本中的变量中 我有以下代码 usr bin ksh echo This script will try to connect to sql plus and displays the date
  • 为什么在释放指针后取消引用它时会得到不同的结果?

    我有一个关于 C 内存管理的问题 以及 Debian GNU Linux 下的 GCC 4 3 3 根据 K R 的 C 编程语言书籍 第 7 8 5 章 当我释放指针然后取消引用它时 会出现错误 但我有一些疑问 因为我注意到有时 正如我在
  • 在 Flask 中,设置 cookie,然后重定向用户

    看起来在 Flask 中 cookie 是通过直接修改响应对象来设置的 如何返回响应对象 同时在成功登录后将用户重定向到不同的页面 我想专门重定向用户而不是呈现不同的页面 以防用户点击刷新 这是我当前的代码 它仅显示同一页面 login h
  • popen()/fgets() 间歇性返回不完整的输出

    我遇到了一个奇怪的问题popen and fgetsLinux系统上的库函数 演示该问题的简短程序如下 安装信号处理程序SIGUSR1 创建辅助线程来重复发送SIGUSR1到主线程 在主线程中 通过以下方式重复执行一个非常简单的 shell
  • rsync 无法解释的错误(代码 129)

    我正在尝试将数据从一台服务器 rsync 到另一台服务器 大约有大约 1 1T 的数据 但是当我进行 rsync 时 我在传输过程中遇到以下异常 从而终止了进程 rsync 错误 rsync c 541 sender 3 0 7 出现无法解
  • uint8 的冗余转换不适用于 GCC 4.8.1

    我有一些遗留代码 通常是使用 GCC 3 4 4 为 PowerPC 编译的 现在我正在移植一些我想用 MinGW 的 GCC 4 8 1 编译的代码部分 在代码中的某个时刻我发现了这一点 Prototypes void foo uint8
  • 如何在不使用全局或会话变量的情况下重用查询结果以更快地导出到 csv 和 xls

    我有一个功能 最初以 HTML 报告 显示结果 然后 可以导出为 CSV 和 XLS 这个想法是重用用于呈现 HTML 的查询的结果 导出相同的记录 而无需再次重新运行查询 最接近的实现是这样的 将结果存储在全局变量 last consul
  • 如何在不移动 X、Y 位置的情况下缩放视图?

    我有一个RadioGroup我正在尝试缩小规模 因为它太大了 所以我用setScaleX and setScaleY 并将其缩小 它可以工作 但问题是当我缩放视图时 视图会改变 X 和 Y 位置 我希望它在缩放后保持相同的左上角坐标 如何让
  • 检查数字中是否有“数字”零的最快方法?

    检查数字中是否包含数字 0 的最快方法是什么 我需要开发一种快速方法 因为我必须在 20 美元秒内对接近 10 9 美元的数字执行这些检查 将其转换为字符串后搜索零是否有效 除以 2 的幂以外的数字 无论数字是多少 都将执行相同次数的运算
  • Swift 4:使用数组中的数据进行分页,以便在用户滚动时进行 API 调用

    背景 在我的应用程序中 我存储了一堆对象 ID 我使用这些 ID 进行批量 API 调用 API 将每次调用限制为 10 个 ID 号 该数据呈现在 UITableView 上 用户可以添加和删除对象 这会在数据库中添加或删除对象 ID 我