On-Demand Resources Guide中文版(按需加载资源--上)

23.png

本文翻译由唧唧歪歪翻译自Apple文档 On-Demand Resources Guide
On-Demand Resources Guide中文版(按需加载资源--下)包含管理按需加载资源、调试以及附录:资源类型

(一)按需加载资源基础

按需加载资源是由App Store托管的内容,它和下载的app bundle是分开的。app请求一系列按需加载资源,而下载和存储资源是由操作系统来管理。这些资源可以是除可执行代码外,bundle支持的任何类型。支持类型的完整列表,请参阅附录a:按需加载的资源类型

按需加载资源主要可以带来以下的几种好处:

  • 初始资源的延迟加载。app有一些资源是主要功能要用到的,但在启动时并不需要。将这些资源标记为“初始需要”。操作系统在app启动时会自动下载这些资源。例如,图片编辑app有许多不常用的滤镜。

  • app资源的延迟加载。app有一些只在特定情景下使用的资源,当应用可能要进入这些场景时,会请求这些资源。例如,在一个有很多关卡的游戏中,用户只需要当前关卡和下一关卡的资源。 

  • 不常用资源的远程存储。app有一些很少使用的资源,当需要这些资源时会去请求它们。例如,当app第一次打开时会展示一个教程,而这个教程之后就可能不会在用到。app在第一次启动时请求教程的资源,这之后只在需要展示教程或者添加了新功能才去请求该资源。

  • 应用内购买资源的远程存储。app提供包含额外资源的应用内购买。app会在启动完成后请求已购买模块的资源。例如,用户在一个键盘app内购买了SuperGeeky表情包。应用程序会在启动完成后请求表情包的资源。

  • 第一次启动时必需资源的加载。app有一些资源只在第一次启动时需要,之后的启动不再需要。例如,app有一个只在第一次启动时展示的教程。

在开发时,通过给按需加载资源分配一个或多个tag来区分。tag是一个你创建的字符串标识符。你可以使用tag的名称来区分这些资源在你的app中是如何使用的。例如,在一个游戏中,所有第五关的资源可以使用tag level-5。

在运行时,你通过指定tag来请求访问远程资源。操作系统会下载和这个tag关联的所有资源,然后保留在存储中,直到app不再使用它们。当操作系统需要更多的存储空间,它会清理一个或多个不再使用的tag关联的资源。tag关联的资源在被清理之前可能会在设备中保存一段时间。

继续上面游戏的例子,游戏有许多关卡,用户只需要当前正在玩的关卡和可能玩的下一关卡的资源。下图的上部展示了包括全部关卡资源的app bundle。可以通过为不同关卡和其他无需放在app内的资源,创建不同tag的按需加载资源,来缩减app bundle的大小。下图的底部显示了一个更小的app,其中加了tag的资源由App Store托管。

01.png

02.png

还有一些其他的功能,比如让你指定那些在app启动之前必须加载的资源,为资源请求设置优先级,追踪资源下载的进度,为不再使用的已下载tag设置保留优先级。

按需加载资源的生命周期

当用户第一次启动app时,设备上唯一的按需加载资源是那些设置为预获取的。随着用户使用app,app会请求加了tag的资源,使用这些资源,然后告诉操作系统不再使用这些资源了。在这之后的某个时间,操作系统会清理一个或多个tag。

注意:app应该请求tag,而不是单个资源。 

当你在开发按需加载资源时,可能会注意到请求下载某个tag时,其他tag也会被下载。这是因为操作系统处理的是资源包(asset pack),这些资源包会为共享资源的下载进行优化。一个tag可能对应多个资源包。资源包是在构建app时由Xcode生成的。

加了tag的资源的生命周期如下所示:

03.png

1、加了tag的资源由App Store托管。

这发生在app第一次启动和之前加载的tag被清理时。

04.png

2、加tag的资源被下载到设备上  

这发生在app请求一个设备上没有的tag之后,或者发生在操作系统下载初始资源。

下图中展示的是,app请求Level11和Foresttag关联的资源,然后下载到设备上。

 

05.png

06.png

3、操作系统将tag保存在本地存储中,并通知app这些tag已经可以使用。

这发生在一个tag下的所有资源都已成功下载之后,或者tag对应的资源都已缓存在本地存储中。

07.png

在tag可用之后,app就可以使用tag关联的资源了。按需加载资源的使用方式和使用下载的app中资源包一样。下图展示了下载的资源就像是app的虚拟成员一样。

 

08.png

4、操作系统释放本地存储中的tag。

被释放的tag还会保存在设备中,直到它再次被请求,或者从本地存储中被清理掉。当一个tag没有被任何请求持有时,tag就可以被清理。在tag被清理之前,它还可能在设备上保存一段时间,包括app多次启动。请求一个tag会持有该tag,然后返回上面的步骤3。

清理tag会返回到上面的步骤1。你可以为tag设置保存优先级来影响清理的顺序。更多信息参见管理按需加载资源。

启用按需加载资源

对于支持iOS 9.0及以后的app,按需加载资源是默认开启的。你也可以在target的build settings中手动更改。

启用或关闭按需加载资源:

  1. 在project navigator中选择工程文件。

  2. 在project editor中选择对应的target。

  3. 选择Build Settings选项卡。

  4. 展开Assets分类。

    提示:可以在Build Settings选项卡右上角的搜索框中输入“Assets”,来快速定位到Assets分类。

  5. 设置Enable On-Demand Resources的值。

  • Yes为这个target开启按需加载资源。

  • No为这个target关闭按需加载资源。

09.png

(二)创建和编辑tag

tag用来区分和管理按需加载资源。给一个资源添加一个或多个tag就能将其标记为按需加载资源。在运行时,所有管理按需加载资源的调用都是和tag相关,而不是单个资源。在运行时管理按需加载资源在管理按需加载资源中有讲到。

Xcode中的资源 tag

Xcode提供了管理tag和相关资源的工具。包括创建和编辑tag,添加和删除tag下的资源,指定操作系统在什么时刻下载tag关联的资源。

Resource Tags选项卡

Resource Tags选项卡在project editor中,用来浏览和编辑工程中全部的tag和相关资源。选项卡包括:

  • 添加按钮:用来创建新的tag。

  • 搜索框:用来查找指定的tag或资源。

  • tag编辑器:用来更改tag的名称,删除tag,增删tag下的资源。tag下全部资源所占的存储大小会显示在tag名称右边的圆括号中。大小是依据最后一次构建所选择的运行设备来计算的。

  • tag视图选择器:用来在查看全部tag和查看预获取分类tag之间切换。tag可以在app安装时下载,在安装之后预获取,或者在app运行时按需加载。预取优先级编辑器也会显示每个分类中资源所占的存储大小。大小是依据最后一次构建所选择的运行设备来计算的。

10.png

按需加载资源tag框

在按需加载资源tag框中,你可以快速浏览一个文件夹或资源,并为其添加删除tag。在Asset Catalog中,如果文件夹或者某个类型的资源可以加tag的话,这个框显示在Attributes inspector中,如下图所示。

11.png

12.png

创建tag

创建tag的第一步是检查你的app在运行时如何使用资源。看看你的app是否有以下几种资源:

  • 在任何时刻都必须是app的一部分。

  • 可以提升用户体验,但在启动app时不是必需的。包括高分辨率素材、高质量声音等等。

  • 在特定场景下才需要。

上面说的后两类的就有可能是按需加载资源。在app第一次启动后马上就要用到的资源可以设置为在安装后自动预获取。操作方法见预获取tag。每个tag下的资源总计大小不能超过2GB。按需加载资源的总计大小不能超过20GB。按需加载资源的大小是不算在app bundle的大小中的。更多信息,参见附录B:按需加载资源的大小限制。

一个tag的理想大小是不超过64MB。这能很好地平衡下载速度和本地存储大小,当设备的存储空间不足时可以进行清理。

tag的名称最好能区分出资源是如何使用的。例如,所有和森林场景有关的资源就可以起名叫forest-scenery。

创建好tag后就可以分配给资源了。一个资源可以添加多个tag。例如在下图中,游戏的资源是按关卡和地点来分割的。

 

13.png

如何创建一个新的tag

  1. 在project navigator中, 选择工程文件。

  2. 为需要新tag的target打开project editor 。

  3. 选择 Resource Tags 选项卡。

  4. 点击选项卡左上角的添加按钮(+)。

如下图所示,会显示一个新的tag输入框。

14.png

5. 输入tag的名称来替换占位符。

为资源添加tag

可以为任何有效的按需加载资源类型添加tag。具体的有效类型,参见附录A

在Asset Catalog中添加tag

  1. 在project navigator中, 选择Asset Catalog。

  2. 在列表中选择一项 。

  3. 为选择的项目打开Attributes inspector。

  4. 在按需加载资源tag框,输入tag的名称。

    Xcode会根据输入的字符进行自动补全提示。

15.png

5.  按下Return键来确认输入的tag名称。

注意:输入一个新的名称,并按下Return键,会创建一个新的tag。

在按需加载资源tag框为工程中的某个文件添加tag

  1. 在project navigator中, 选择一个文件。

  2. 打开实用工具区,点击File inspector 按钮。

  3. 在按需加载资源tag框,输入tag的名称。

Xcode会根据输入的字符进行自动补全提示。

16.png

4.  按下Return键来确认输入的tag名称。

注意:输入一个新的名称,并按下Return键,会创建一个新的tag。

使用Resource Tags选项卡来给工程中的文件添加tag

  1. 在project navigator中, 选择工程文件。

  2. 为target打开project editor 。

  3. 选择 Resource Tags 选项卡。

  4. 在搜索框中,输入tag的名称。列表会根据搜索的文字进行过滤。

  5. 点击添加按钮(+),会弹出一个对话框。

17.png

6.  在输入框中,输入资源文件的名称。

7.  选中想要的资源文件,点击Add。这个资源文件就加上tag了。

注意: Asset Catalogs中的资源必须使用按需加载资源tag框来添加tag。

从tag中删除资源

可以通过在按需加载资源tag框删除tag,来将资源从tag中删除。也可以在Resource Tags 选项卡中删除资源。

使用Resource Tags选项卡来删除tag下的资源

  1. 在project navigator中, 选择工程文件。

  2. 为target打开project editor 。

  3. 选择 Resource Tags 选项卡。

  4. 在搜索框中,输入tag的名称。列表会根据搜索的文字进行过滤。

  5. 在tag对应的行中,点击左侧的小箭头来展开tag编辑器(如果没有展开的话)。

  6. 在tag编辑器中,选择列表中的资源文件。

  7. 在tag编辑器中,点击删除按钮(-)。

在Asset Catalog中添加tag 

  1. 在project navigator中, 选择Asset Catalog。

  2. 在列表中选择一项 。

  3. 为选择的项目打开Attributes inspector。

  4. 在按需加载资源tag框,选择一个tag,按下Delete键。

在按需加载资源tag框为工程中的某个文件删除tag

  1. 在project navigator中, 选择一个文件。

  2. 打开实用工具区,点击File inspector 按钮。

  3. 在按需加载资源tag框,选择一个tag,按下Delete键。

预获取的tag

通常来说,操作系统是不会下载一个tag下的资源,直到app请求一个tag并且该tag的资源没有在设备上缓存。一些tag中会包含启动时需要或者启动后马上要用到的资源。

在Resource Tags选项卡的Prefetched界面下,可以把tag分配给三个预获取优先级分类的其中一个。界面展示了按预获取分类分组的tag。tag可以在分类间拖动。

18.png

  • 初始安装tag(Initial install tags)。只有在初始安装tag下载到设备后,app才能启动。这些资源会在下载app时一起下载。这部分资源的大小会包括在App Store中app的安装包大小。如果这些资源从来没有被NSBundleResourceRequest对象获取过,就有可能被清理掉。

  • 按顺序预获取tag(Prefetch tag order)。在app安装后会开始下载tag。tag会按照此处指定的顺序来下载。 

  • 按需下载(Dowloaded only on demand)。当app请求一个tag,且tag没有缓存时,才会下载该tag。

将tag设置为随app安装

  1. 在project navigator中, 选择工程文件。 

  2. 为target打开project editor 。 

  3. 选择 Resource Tags 选项卡。

  4. 在tag视图选择器,点击Prefetched。

  5. 在内容区,点击Initial Install Tags分类旁边的小箭头。

  6. 在内容区,找到你想要随app安装的tag。

  7. 点击并拖动该tag到Initial Install Tags列表。 

将tag设置为预获取

  1. 在project navigator中, 选择工程文件。 

  2. 为target打开project editor 。 

  3. 选择 Resource Tags 选项卡。

  4. 在tag视图选择器,点击Prefetched。

  5. 在内容区,点击Prefetched Tag Order分类旁边的小箭头。

  6. 在内容区,找到你想要预获取的tag。

  7. 点击并拖动该tag到Prefetched Tag Order列表。 tag在列表的位置会决定下载的顺序。列表最上面的tag会最先下载。

将tag设置为只在app请求时下载

  1. 在project navigator中, 选择工程文件。 

  2. 为target打开project editor 。 

  3. 选择 Resource Tags 选项卡。

  4. 在tag视图选择器,点击Prefetched。

  5. 在内容区,点击Downloaded Only On Demand分类旁边的小箭头。

  6. 在内容区,找到你想要按需下载的tag。

  7. 点击并拖动该tag到Downloaded Only On Demand列表。 


On-Demand Resources Guide中文版(按需加载资源--下)包含管理按需加载资源、调试以及附录:资源类型


转载于:https://my.oschina.net/hejunbinlan/blog/474867

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值