利用数据源提高性能

已完成

在上一单元中,您已了解数据源通常是应用性能下降的主要原因。 本单元将介绍一些常见技巧,用于缓解这些性能问题。

使用集合来缓存数据

在您的应用中,您会经常发现自己重复查询相同的数据,就像为下拉菜单拉取部门列表的情况一样。 在这些情况下,可以只查询一次数据,然后在整个应用中重复使用该数据。 这可减少通过网络对数据源的重复调用。 下面是本过程的一个示例。

应用中有几个屏幕,其中提供了用于选择部门的下拉菜单。 部门列表保存在 Microsoft Dataverse 的一个名为 DepartmentList 的表中。 对于菜单的每个实例,可使用以下公式。

Filter(DepartmentList, Status = "Active")

这不仅适用,且执行正常。

完成应用后,您意识到自己正在多次查询 DepartmentList 表,虽然该表是静态信息。 可以使用以下公式修改应用,以创建具有该应用的 OnStart 属性的集合,用于存储信息。

ClearCollect(colDepartmentList, Filter(DepartmentList, Status = "Active"))

现在已存储该信息,可以将下拉控件的 Items 属性更改为 colDepartmentList,而不是 Filter(DepartmentList, Status = "Active")。 这些小更改可提高应用的性能。 此外,随着对该技巧熟悉度的增加,还可以从一开始就以这种方式生成应用,从而减少必须编写和维护的公式数量。

注意委派

请谨记一点,Collect 函数不可委派。 这意味着默认情况下仅从数据源返回前 500 个项目,然后存储在集合中。 在应用中实现集合的使用时,请务必规划本限制。

委派还会影响性能

在了解委派时,侧重点在于如何为数据源返回正确的行数。 同时切记,委派会影响性能,尤其是对于移动应用。

公式向数据源委派时,所有处理操作都由数据源处理,并且只有匹配的行会通过网络返回到应用以供显示。 如果某个函数不可委派,则将委派限制更改为 2,000 行十分常见。 这意味着前 2,000 行将通过网络下载,然后在本地进行处理。 对于使用慢速手机网络连接或低端移动设备的情况,此处理可能需要相当长的时间,从而导致用户体验不佳。

请尽可能尝试只使用可委派函数。 如果函数不可委派,请就对最终用户产生的影响进行规划。

使用 Concurrent 函数加载多个数据源

前面介绍了如何在应用中使用集合来缓存数据。 在应用中实现该功能时,应用启动时加载多个集合很常见。 OnStart 属性可能如下所示。

ClearCollect(colDepartmentList, Filter(DepartmentList, Status = "Active")); 
ClearCollect(colCompanyList, CompanyList); 
ClearCollect(colRegions, RegionList)

在该示例中,您要创建三个集合,但一次仅处理一个集合。 因此,如果每个集合需要 3 秒钟来处理,那么用户须等待 9 秒才能启动应用。

利用 Concurrent 函数可同时处理所有这些调用。 可以将代码更改为以下内容。

Concurrent(
ClearCollect(colDepartmentList, Filter(DepartmentList, Status = "Active")),
ClearCollect(colCompanyList, CompanyList),
ClearCollect(colRegions, RegionList)
)

现在,所有三个公式同时运行,这将加载时间缩短到三秒。 Concurrent 是避免异步调用长时间延迟的好方法。

预览功能和试验功能

Power Apps 中提供可以在应用中实现的其他高级功能。 可以通过选择菜单栏上的文件,然后选择应用设置高级设置来访问这些功能。 显示的选项列表会不断变化,但通常都具有一个或多个与性能相关的功能。

预览功能

预览功能是经过充分测试并即将发布的功能。 它们即将面向所有应用推出。 测试和了解这些功能有助于为其标准版做好准备,并且默认情况下大多数新应用中都会启用这些功能。

有助于提高性能的当前预览功能的一个示例是针对设备进行优化。 借助本功能,制作者可以通过使用本机 UI 元素(而不是在 Web 视图中呈现的元素)的设备优化屏幕,为移动用户生成令人惊叹的本机应用。

试验功能

试验功能是随时可能更改、中断或消失的功能。 默认情况下会关闭这些功能。 有时还可以在此处发现性能功能,因此值得一看。 但请牢记,将这些功能引入生产应用中会存在风险,因为它们可能演变、完全改变或消失。

有时,您可能会看到与应用性能相关的试验功能。 您可以随时启用并测试该功能,然后返回设置,将其禁用。

OnStart 与 OnVisible

OnStart 和 OnVisible 是用于生成出色应用的工具包的一部分,但从性能的角度来看,它们可产生重大影响。

  • OnStart - 这是一种应用级属性。 本属性中的公式将运行一次(应用启动时),此后便不会再次运行。 所有公式必须在应用打开前进行处理。 这通常用于初始化您将在整个应用中需要的数据。

  • OnVisible - 这是一种按屏幕运行的属性。 每次用户导航到屏幕时,都会运行本属性中的公式。 屏幕将在公式完成处理之前呈现。

从性能角度来看,关键考虑因素是代码何时运行。 在应用启动后运行一次,或在每次显示屏幕时运行一次。 本模块前文所述的部门集合就是一个很好的示例。 该代码会加载到应用的 OnStart 属性中。 这意味着加载一次后便一直可供使用。 如果将代码从 OnStart 移到 OnVisible,则将失去集合的优势。 如果公式在 OnVisible 属性中,则每次用户导航到屏幕时都会查询数据源。 在这种情况下,将代码留在下拉菜单中也同样可以执行。

这并不意味着不应使用 OnVisible。 OnVisible 非常适用于与需要运行的当前屏幕相关的公式。 此外,OnVisible 为非锁定属性。 因此用户无需等待公式完成即可查看屏幕,这减少了用户需要查看空白屏幕的次数。

在大多数应用中,混合使用 OnStart 和 OnVisible 可获得最佳体验。

总结

如您所见,很多选项都可用于生成应用并与数据源交互。 本单元中的列表只介绍了很小一部分。 此处的指南旨在指导您如何提升性能,但结果可能会有所不同。 开始在应用中应用这些方法时,您将了解哪种技巧最适合自己和自己的环境。

下一单元介绍有关测试和故障排除的技巧。