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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍

文章目录 openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍59.1 数据库59.2 表空间59.3 模式59.4 用户和角色59.5 事务管理 openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍 59.1 数据库 数据库用于管理各类数据对象&#xff0c;与其他数据库隔离。创建数据…

【数据结构】树和二叉树的概念及结构(一)

目录 一&#xff0c;树的概念及结构 1&#xff0c;树的定义 2&#xff0c;树结点的分类及关系 3&#xff0c;树的表示 二&#xff0c;二叉树的概念及结构 1&#xff0c;二叉树的定义 2&#xff0c;特殊的二叉树 3&#xff0c;二叉树的性质 4&#xff0c;二叉树的存储结构 1&…

无涯教程-Android Intent Standard Extra Data函数

下表列出了各种重要的Android Intent Standard Extra Data。您可以查看Android官方文档以获取额外数据的完整列表- Sr.NoExtra Data & Description1 EXTRA_ALARM_COUNT 用作AlarmManager intents(意图)中的int Extra字段,以告诉正在调用的应用程序intents(意图)释放了多少…

Pnpm,npm,yarn

npm 最初的npm只是简单的通过依赖去递归安装包&#xff0c;所以说每个依赖都会有自己的node_modules,node_modules是嵌套的。一个项目会存在多个包&#xff0c;多个包之间难免会有公共的依赖&#xff0c;node_modules嵌套的话&#xff0c;这样公共依赖就会下载多次。会造成磁盘…

Three.js之层级模型

参考资料 Vector3与模型位置、缩放属性…模型隐藏或显示 知识点 注&#xff1a;基于Three.jsv0.155.0 Group&#xff1a;add()遍历模型树结构、查询模型节点&#xff1a;name、traverse、getObjectByName()本地坐标和世界坐标&#xff1a;getWorldPosition()改变模型相对局…

MQTT异常掉线原因

一、业务场景 我们在使用MQTT协议的时候&#xff0c;有些伙伴可能会遇到MQTT客户端频繁掉线、上线问题 二、原因分析及异常处理 1.原因&#xff1a;使用相同的clientID 方案&#xff1a;全局使用的clientID保证唯一性&#xff0c;可以采用UUID等方式 2.原因: 当前用户没有Top…

Shell文件常用语法

参考链接&#xff1a;https://juejin.cn/post/7249347651787980861 Shell脚本是一种命令语言&#xff0c;可以用于自动化执行各种任务。在脚本中&#xff0c;我们可以通过参数来传递信息&#xff0c;这样脚本就可以根据这些信息来执行特定的操作。本文将介绍如何在shell脚本中…

【数据结构】二叉树篇|超清晰图解和详解:二叉树的序列化和反序列化

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、核心二、题目2.1:前序遍历2.2&…

【博客701】shell实现保留网络现场:ping失败时执行mtr

shell实现保留网络现场&#xff1a;ping失败时执行mtr 场景 当我们网络出现抖动&#xff0c;到某个目的地ping不通时&#xff0c;我们想知道路径上哪里出现问题时可以在那时候执行mtr并保留下现场以供排查 实现&#xff1a;ping_and_mtr.sh #!/bin/bash# 定义要ping的IP地址列…

x86_64 ansible 源码编译安装

源码 GitHub - ansible/ansible: Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy and maintain. Automate everything from code deployment to network configuration to cloud management, in a languag…

js常用方法总结

1、slice 和 splice slice表示截取&#xff0c;slice(start,end)&#xff0c;不改变原数组&#xff0c;返回新数组。 splice表示删除&#xff0c;splice(start,length,item)&#xff0c;会改变原数组&#xff0c;从某个位置开始删除多个元素&#xff0c;并可以插入新的元素。…

2.4 关系数据库

思维导图&#xff1a; 前言&#xff1a; 这段话描述了“关系数据库”及其背后的理论基础。首先&#xff0c;我们来拆分这段话并逐步解释每部分。 关系数据库是采用关系模型作为数据组织方式的数据库。 这句话的关键是“关系模型”。关系模型是一种表示和操作数据库的理论模型…

操作系统清华同步笔记:定义概述+计算机内存和硬盘布局+启动流程顺序+中断、异常和系统调用

定义概述 从用户角度来看&#xff0c;操作系统是一个控制软件&#xff0c;用以管理应用程序&#xff0c;为应用程序提供服务&#xff0c;杀死应用程序等。从内部文件角度来看&#xff0c;操作系统是一个资源管理器&#xff0c;用以管理外设&#xff0c;分配资源。层次结构&…

命令行编译VS工程

先输入以下命令&#xff0c;因为命令出错了&#xff0c;就会弹出帮助&#xff0c;如下&#xff1a; "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe" /help 反正就是Microsoft Visual Studio 的安装路径。 帮助界面如下&#xff1a…

Selenium如何用于编写自动化测试脚本?

Selenium如何用于编写自动化测试脚本&#xff1f;它提供了许多测试工具和API&#xff0c;可以与浏览器交互&#xff0c;模拟用户操作&#xff0c;检查网页的各个方面。下面是一些步骤&#xff0c;可以帮助你编写Selenium自动化测试脚本。 1、安装Selenium库和浏览器驱动程序 首…

core dump管理在linux中的前世今生

目录 一、什么是core dump&#xff1f; 二、coredump是怎么来的&#xff1f; 三、怎么限制coredump文件的产生&#xff1f; ulimit 半永久限制 永久限制 四、从源码分析如何对coredump文件的名字和路径管理 命名 管理 一些问题的答案 1、为什么新的ubuntu不能产生c…

java设计模式---策略模式

策略模式的定义 策略设计模式是一种行为设计模式。当在处理一个业务时&#xff0c;有多种处理方式&#xff0c;并且需要再运行时决定使哪一种具体实现时&#xff0c;就会使用策略模式。 策略模式的类图&#xff1a; 策略模式的实现 在支付业务中&#xff0c;有三种付款方式&…

RabbitMQ工作模式-工作队列

官网关于工作模式的解释地址&#xff1a;https://www.rabbitmq.com/getstarted.html Work Queue&#xff08;工作队列&#xff09; 生产者发消息&#xff0c;启动多个消费者来消费消息&#xff0c;每个消费者仅消费部分消息&#xff0c;可达到负载均衡的效果。 创建生产者 i…

使用docker、docker-compose部署微服务

使用docker、docker-compose部署微服务 一、使用docker部署1、准备2、上传jar包3、编写dockerfile文件3、构建镜像和容器 二、使用docker-compose部署1、准备服务的jar包和dockerfile文件2、编写docker-compose.yml文件3、docker-compose常用命令&#xff08;1&#xff09;、前…

Linux用户与组管理(01)(六)

目录 前言 一、用户管理 1、 概述 2、用户操作 总结 前言 今天学习的是新知识&#xff0c;Linux用户与组管理&#xff0c;刚开始就是简单的一些概念、命令等&#xff0c;今天学习的内容也都是重点哦&#xff01;希望我们可以一起学习&#xff0c;共同发展和进步。 提示&#x…