当前位置: 首页 > 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
http://www.lryc.cn/news/152262.html

相关文章:

  • arduino仿真 SimulIDE1.0仿真器
  • vue实现导出excel的多种方式
  • redis实战-实现优惠券秒杀解决超卖问题
  • C语言:截断+整型提升+算数转换练习
  • Java后端开发面试题——多线程
  • Redis 学习笔记
  • 华为云新生代开发者招募
  • DockerFile简明教程
  • Cygwin是什么?是Windows还是Linux?
  • 成集云 | 多维表格自动化管理jira Server项目 | 解决方案
  • 数据结构(Java实现)-排序
  • C++------vector【STL】
  • Matlab(变量与文本读取)
  • WebGPU学习(8)---使用RenderBundle
  • 【前端】常用功能合集
  • chatgpt谈论日本排放污水事件
  • Linux 查看当前目录大小
  • 操作系统备考学习 day1 (1.1.1-1.3.1)
  • HTTP:http上传文件的原理及java处理方法的介绍
  • [实习笔记] 字符串练习 (将大量的字符串用int值编码,然后通过int值二分快速查找某个字符串)
  • EMC VNX2代一键关机方法
  • 提升系统管理:监控和可观察性在DevOps中的作用
  • IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南
  • Linux系统中驱动入门设备树DTS(经典)
  • 关系型数据库与非关系型数据库类比
  • Ubuntu入门03——Ubuntu用户操作
  • 输出图元(四)8-1 图元、屏幕坐标、指定二维世界坐标系统
  • 机器学习---决策树的划分依据(熵、信息增益、信息增益率、基尼值和基尼指数)
  • java解析json
  • PAT 1163 Dijkstra Sequence