【问题标题】:iOS Swift 5 Realm Results w/ UITableView blocks UIiOS Swift 5 Realm 结果 w/ UITableView 块 UI
【发布时间】:2017-05-30 16:56:29
【问题描述】:

我正在构建一个基于领域数据库的应用程序。我有一个包含 5 个 UITableViews 的概览屏幕,这些 UITableViews 都由一个结果和一个 NotificationToken 提供支持。所以总的来说,我有 5 个结果和 5 个 NotificationToken(每个都有不同类型的对象)。

此概览屏幕显示在 UITabBarController 的第二个选项卡中。当我第一次运行该应用程序并选择概述选项卡时,需要很长时间才能显示选项卡(~1s)。

我可以做些什么来加快加载时间或在加载结果时保持 UI 响应?

结果会加载其对象类型的所有实体。所有都按“名称”键路径排序。

【问题讨论】:

    标签: ios swift uitableview realm


    【解决方案1】:

    我可以做些什么来加快加载时间或在加载结果时保持 UI 响应?

    这取决于时间花在哪里。

    1。大型领域文件

    如果 Realm 文件很大,内存映射可能是一项计算量很大的操作。如果是这种情况,您可以使用 Realm.asyncOpen(...) 在后台队列上异步打开文件,将打开的 Realm 传递到给定的回调队列(例如主队列)上。

    2。大量对象

    如果您有大量的对象,也许您可​​以重构您的数据模型以减少该数量?

    例如,假设您的模型上有一个 isDeleted 布尔属性,并且稍后当您的应用具有连接性时,您在 RESTful Web API 中手动同步这些删除操作。您可以拥有一个新模型(例如WebOperation)而不是保留所有这些对象,而该模型仅包含执行该操作所需的信息,而不是完整的对象(例如{operation: 'delete', id: '1234'}

    3。计算昂贵的查询

    如果您的任一(或全部)查询计算量很大,您可以在后台线程上异步执行它们。通过将通知块添加到 Realm 集合(例如 Results),如果您不同步访问 Results,通知块将在后台运行查询,将 Results 传递到 .initial仅当查询已被评估时才会在原始线程上通知,这会将查询操作卸载到后台线程,从而释放您的 UI 线程。

    4。优化不足的查询

    某些查询比其他查询更快。尝试不同的方法来构建查询、测量和比较结果。选择最有效的变体。

    【讨论】:

    • 想象一个拥有汽车、制造商和颜色的应用程序。你想并排展示它们。每个 tableview 都由作为数据源的 Results 和 NotificationToken 提供支持,以自动填充更新(插入/移动/删除/重新加载)。 Realm 文件本身实际上并没有那么大。假设有 100 辆汽车、20 种制造商和 30 种颜色)所以我认为 1 并不是我猜的问题(或者它可能已经是瓶颈了吗?)。查询是“按名称排序所有汽车”、“按名称排序所有制造商”、“按名称排序所有颜色”。
    • 不确定这有多贵。我从不直接调用 tableView.reload() 而是只设置结果,然后通知令牌和令牌内部使用 .initial 第一次重新加载 tableview。所以,嗯,我不确定我应该做什么。可能是我在主线程上设置结果的问题吗?
    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多