当前位置: 首页 > news >正文

iOS - 资源按需加载 - ODR

一、瘦身技术大图

二、On-Demand Resources 简介

 将其保存管理在苹果的服务器,按需使用资源、优化包体积,实现更小的应用程序。ODR 的好处:

  • 应用体积更小,下载更快,提升初次启动速度
  • 资源会在后台下载
  • 操作系统将会在磁盘资源不够的时候清理 ODR

三、实现

3.1、创建标签
标签的理想大小小于或等于64 MB。这种尺寸在下载速度和本地存储空间之间提供了良好的平衡,以便在设备的本地存储空间不足时进行清理。

  • Initial install tags:初始安装标签,资源与应用程序同时下载;
  • Prefetch tag order.:预取标签顺序,安装应用程序后,资源开始下载;
  • Dowloaded only on demand:仅按需下载。当应用程序要求时,标签会下载;

 3.2、pod组建引用

s.on_demand_resources = {

  'Tag1' => 'file1.png'

}

s.on_demand_resources = {

  'Tag1' => ['file1.png', 'file2.png']

}

s.on_demand_resources = {

  'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :download_on_demand }

}

s.on_demand_resources = {

  'Tag1' => { :paths => ['file1.png', 'file2.png'], :category => :initial_install }

}

3.3、访问和下载资源

- (NSBundleResourceRequest *)requestOdrWithTags:(NSSet<NSString *> *)tags {

    NSBundleResourceRequest *request = [[NSBundleResourceRequest alloc] initWithTags:tags];

    /// 检查设备上是否已有标签

    [request conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) {

        if (!resourcesAvailable) {

            /// 资源不在本地

            [request beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) {

                if (error) {

                    /// 下载失败

                    [self failRetryWithTags:tags];

                } else {

                    /// 下载成功

                    self.retryDelay = 0;

                }

            }];

        } else {

            /// 资源已存在

            self.retryDelay = 0;

        }

    }];

    return request;

}

@interface IMYOdrManager ()

/// 持有 NSBundleResourceRequest,资源才会被使用,要不然会被释放

/// 每个NSBundleResourceRequest 对象只能用于一个请求访问/结束访问周期。

@property (nonatomic, strong) NSBundleResourceRequest *request;

@end

@implementation IMYOdrManager

@synthesize tagName;

IMY_KYLIN_FUNC_LAUNCHED_ASYNC {

    NSSet *set = [NSSet setWithObject:@"IMYLevel1"];

    [[IMYOdrManager sharedInstance] reloadOdrWithTags:set];

}

+ (instancetype)sharedInstance {

    static id instance;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        instance = [self new];

    });

    return instance;

}

- (instancetype)init {

    if (self = [super init]) {

        [self addObserver];

    }

    return self;

}

#pragma mark - public

- (void)reloadOdrWithTags:(NSSet *)set {

    self.tagName = set;

    [self reloadOdr];

}

- (void)reloadOdr {

    if (self.tagName.count > 0) {

        self.request = [[IMYOdrDownloadManager new] requestOdrWithTags:self.tagName];

        // 设置优先级 between 0.0 and 1.0

        self.request.loadingPriority = 1.0;

    }

}

#pragma mark - private

- (void)addObserver {

    /// 低空位警告

    @weakify(self);

    [[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:NSBundleResourceRequestLowDiskSpaceNotification object:nil] deliverOnMainThread] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSNotification *notify) {

        @strongify(self);

        [self.request endAccessingResources];

    }];

}

@end

3.4、一些额外方法

/// 暂停当前下载

- (void)pauseOdr {

    [self.request.progress pause];

}

/// 恢复当前下载

- (void)resumeOdr {

    [self.request.progress resume];

}

/// 取消当前下载

- (void)cancelOdr {

    [self.request.progress cancel];

}

3.5、运行后的效果

3.6、通常的设计原则

  • 必要时可用
  • 下载期间影响最小
  • 对应用程序内存的影响最小

四、参考文献

  • On-Demand Resources Guide
  • NSBundleResourceRequest

相关文章:

iOS - 资源按需加载 - ODR

一、瘦身技术大图 二、On-Demand Resources 简介 将其保存管理在苹果的服务器&#xff0c;按需使用资源、优化包体积&#xff0c;实现更小的应用程序。ODR 的好处&#xff1a; 应用体积更小&#xff0c;下载更快&#xff0c;提升初次启动速度资源会在后台下载操作系统将会在磁…...

arduino仿真 SimulIDE1.0仿真器

SimulIDE 是一个开源的电子电路模拟器&#xff0c;支持模拟各种电子元器件的行为&#xff0c;可以帮助电子工程师和爱好者进行电路设计和测试。以下是 SimulIDE 的安装和使用说明&#xff1a; 安装 SimulIDE SimulIDE 可以在 Windows、Linux 和 Mac OS X 等操作系统上安装。您…...

vue实现导出excel的多种方式

在Vue中实现导出Excel有多种方式&#xff0c;可以通过前端实现&#xff0c;也可以通过前后端配合实现。下面将详细介绍几种常用的实现方式。 1. 前端实现方式&#xff1a; 使用xlsx库&#xff1a;使用xlsx库可以在前端将数据导出为Excel文件。首先需要安装xlsx库&#xff0c;…...

redis实战-实现优惠券秒杀解决超卖问题

全局唯一ID 唯一ID的必要性 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易被用户根据id的间隔来猜测…...

C语言:截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章&#xff1a; 《C语言&#xff1a;整型提升》 《C语言&#xff1a;算数转换》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求…...

Java后端开发面试题——多线程

创建线程的方式有哪些&#xff1f; 继承Thread类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("MyThread...run...");}public static void main(String[] args) {// 创建MyThread对象MyThread t1 new MyThread() ;MyTh…...

Redis 学习笔记

文章目录 一、简介二、下载三、安装四、启动和关闭五、配置文件六、常用指令七、安全加固 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2023年9月3日首发于CSDN&#xff0c;转载请附上原文出处链接及本声明。 原…...

华为云新生代开发者招募

开发者您好&#xff0c;我们是华为2012UCD的研究团队 为了解年轻开发者的开发现状和趋势 正在邀请各位先锋开发者&#xff0c;与我们进行2小时的线上交流&#xff08;江浙沪附近可线下交流&#xff09; 聊聊您日常开发工作中的产品使用需求 成功参与访谈者将获得至少300元京…...

DockerFile简明教程

需求 由于在测试环境中使用了docker官网的centos 镜像&#xff0c;但是该镜像里面默认没有安装ssh服务&#xff0c;在做测试时又需要开启ssh。所以上网也查了查资料。下面详细的纪录下。在centos 容器内安装ssh后&#xff0c;转成新的镜像用于后期测试使用。 镜像定制 第一种…...

Cygwin是什么?是Windows还是Linux?

原文作者&#xff1a;gentle_zhou 原文链接&#xff1a;https://bbs.huaweicloud.com/blogs/408674 最近在和客户交流的时候&#xff0c;一直以为客户的研发环境就是windows 7&#xff0c;直到和对面的研发团队交流的时候&#xff0c;得到的反馈是在windows 7系统上安装了Cygw…...

成集云 | 多维表格自动化管理jira Server项目 | 解决方案

源系统成集云目标系统 方案介绍 基于成集云集成平台&#xff0c;在多维表格中的需求任务信息自动创建、更新同步至 Jira Server 的指定项目中&#xff0c;实现多维表格中一表管理 Jira Server 中的项目进度。 维格表是一种新一代的团队数据协作和项目管理工具&…...

数据结构(Java实现)-排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff…...

C++------vector【STL】

文章目录 vector的介绍及使用vector的介绍vector的使用 vector的模拟实现 vector的介绍及使用 vector的介绍 1、vector是表示可变大小数组的序列容器。 2、就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数…...

Matlab(变量与文本读取)

目录 1.变量&#xff08;数据&#xff09;类型转换 1.1 字符 1.2 字符串 1.3 逻辑操作与赋值 2.Struct结构体数组 2.1函数的详细介绍&#xff1a; 2.1.1 cell2struct 2.1.1.1 垂直维度转换 2.1.1.2 水平维度转换 2.1.1.3 部分进行转换 2.1.2 rmfield 2.1.3 fieldnames(查…...

WebGPU学习(8)---使用RenderBundle

RenderBundle是什么 通常情况下&#xff0c;WebGPU每次绘制时都需要向RenderPassEncoder注册渲染命令。处理此绘图命令比 WebGL 内部执行的类似处理更快。但是&#xff0c;如果可以省略此命令注册过程&#xff0c;则可以能够更快地绘制。RenderBundle 就是实现这一点的。 Ren…...

【前端】常用功能合集

目录 js跳转到新标签打开PDF文件js每十个字符换行 es6用表达式或变量名作为对象的属性名 vuev-for插值、:style、:class父组件加载完后再加载子组件keep-alive缓存跨域请求第三方接口跨域请求之callback&#xff08;不建议&#xff09;读取本地文件浏览器播放提示音audio jquer…...

chatgpt谈论日本排放污水事件

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 近日&#xff0c;世界发生了让人义愤填膺的时间——日本排放核污水。这件事情是那么的突然且不计后果&#xff0c;海洋是我们全人类共同的财产&#xff0c;而日本却想用自己一己私欲将全人类的安全置之度外&#xff0c…...

Linux 查看当前目录大小

分析&回答 1. 查看当前目录下所有目录及子目录大小 du -h - . “.”代表当前目录下。也可以换成一个明确的路径 复制代码 2.查看当前文件目录各个文件夹大小 du -h --max-depth1 复制代码 查看指定目录 du -h --max-depth1 /path 复制代码 -h表示用K、M、G的人性化形…...

操作系统备考学习 day1 (1.1.1-1.3.1)

操作系统备考学习 day1 计算机系统概述操作系统的基本概念操作系统的概念、功能和目标操作系统的四个特征并发共享虚拟异步 操作系统的发展和分类操作系统的运行环境操作系统的运行机制 年初做了一个c的webserver 的项目&#xff0c;在学习过程中已经解除部分操作系统的知识&am…...

HTTP:http上传文件的原理及java处理方法的介绍

为了说明原理&#xff0c;以下提供一个可以上传多个文件的例子&#xff0c;html页面代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>http upload file</title> </head> <body>…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...