iOS - 资源按需加载 - ODR

这篇具有很好参考价值的文章主要介绍了iOS - 资源按需加载 - ODR。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、瘦身技术大图

iOS - 资源按需加载 - ODR,ios二、On-Demand Resources 简介

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

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

三、实现

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

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

iOS - 资源按需加载 - ODR,ios

iOS - 资源按需加载 - ODR,ios

 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、运行后的效果

iOS - 资源按需加载 - ODR,ios3.6、通常的设计原则

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

四、参考文献文章来源地址https://www.toymoban.com/news/detail-678785.html

  • On-Demand Resources Guide
  • NSBundleResourceRequest

到了这里,关于iOS - 资源按需加载 - ODR的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS 制作私有库framework + 图片资源的使用

    开源库 :公开源代码,能看到具体实现 ** 闭源库**:不公开源代码,是经过编译后的二进制文件,看不到具体实现;其中包括:静态库和动态库 我了解的开源库的制作,就是将代码上传到cocopods上,提供其他人下载使用。 优点:制作简单 缺点:暴露源码 cocopods上传的步骤:

    2024年02月10日
    浏览(35)
  • iOS——从静态库到分类加载-ObjC

    最近深究了下依赖静态库分类,链接参数需要-ObjC的问题。 首先需要介绍一下我对静态库的理解。 静态库本质上就是目标文件,是还没有链接的文件。静态库分两种: 目标文件 .o ; 目标文件archive,通常是 .a 形式; .a 就是若干目标文件的集合压缩,可以通过ar来创建、查看

    2023年04月09日
    浏览(34)
  • IOS开发之——音乐播放器-资源和Model(02)

    音乐播放器资源文件 资源文件转换为对应的Model类 2.1 图片资源 Images.xcassets(启动图标/播放按钮/默认背景等) 2.2 Resources(歌曲资源) Images(音乐大图) Lrcs(音乐歌词文件) MP3s(本地歌曲文件) Musics.plist(所有歌词信息,转换为HMMusic Model) 2.3 查看Copy Bundle Resources Targets——Build Phases——

    2023年04月12日
    浏览(41)
  • FPGA引脚物理电平(内部资源,Select IO)-认知2

    引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and differential HSTL and SSTL) 引脚种类 VCCO ,for PL 每个Bank对应一个电压,HP Bank VC

    2024年01月22日
    浏览(41)
  • ios 自制Framework 获取指定bundle并读取里面的资源

    原文地址:https://zhanglei.blog.csdn.net/article/details/121673288 目录 一、前言 二、访问应用资源 三、Framework中的资源存放 四、访问Framework中指定的bundle 五、访问bundle中的资源 六、建议Framework与bundle分开存放 应用中某些模块需要组件化,组件化后的工程最后会做二进制化处理,打包

    2024年02月14日
    浏览(32)
  • 【Linux初阶】基础IO - 动静态库 | 初识、生成、链接、加载

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:动静态库初识,库的含义,静态库的生成与链接,gcc/g++默认链接方式,动态库的生成与动态链接,查看动态链接的方法,动静态库的加载原理 🚢🚢作者简介:计算机海洋的新进船长一

    2024年02月14日
    浏览(36)
  • Ingress 资源与 networking.k8s.io/v1 问题

    在 kubernetes v1.18.20 根据 traefik 官方文档部署 时,当执行 kubectl apply -f 04-whoami-ingrsss.yaml 时 上执行以下 yaml 文件创建 ingress 资源的时候出现了这种报错 error: unable to recognize \\\"04-whoami-ingress.yaml\\\": no matches for kind \\\"Ingress\\\" in version \\\"networking.k8s.io/v1\\\" 查看 kubernetes 官方文档:https://kuber

    2023年04月08日
    浏览(36)
  • Linux系统资源分析手段:CPU,内存,磁盘与网络IO的瓶颈定位

    用于优化: 在程序编码完成后,我们通常要对自己编写的工具进行功能测试与性能分析。 用于监控: 在观察某个系统的运行情况时,需要观察系统内多个中间件及组件的资源占用情况。 用于测试: 在开启某个服务时,我们需要拥有对于该服务运行时资源占用的量化手段。

    2024年01月18日
    浏览(87)
  • SwiftUI 实现一个 iOS 上 Files App 兼容的文件资源管理器

    在 SwiftUI 中自己白手起家写一个 iOS(或iPadOS)上迷你的文件资源管理器是有些难度滴,不过从 iOS 11 (2017年) 官方引入自家的 Files App 之后,我们就可以借助它的魔力轻松完成这一个功能了。 如上所示,我们使用 SwiftUI 原生功能完成了一个小巧的 iOS Files App 文件管理器,

    2024年02月10日
    浏览(56)
  • UE4查看加密PAK里边的资源Android/iOS/PC方法

    我们经常会需要把1个模型进行减面然后在移动端使用,有时候会出现移动端模型和PC端模型不一致的问题,这时候就需要将移动端的模型和PC端的模型进行对比,找到问题出现的原因,检查Mesh、Normal、UV0、UV1、MaterialId、碰撞等是否一致。 如何打包Pak文件,见这篇文章:UE4打

    2024年02月14日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包