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

高性能iOS应用开发(二):应用的生命周期

应用的启动

首次启动

应用安装后首次启动时,没有任何的使用状态,也没有本地存储,即没有需要加载的内容或者需要从服务器下载初始数据。 一般的首次启动通常执行多个任务。 例如:

  • 加载应用的默认项(用户的默认设置,子系统的配置)
  • 检查私有/测试版本
  • 获取和初始化应用的唯一标识符
  • 初始化一些第三方SDK的配置(崩溃搜集,推送,埋点等)
  • 初始化网络配置和建立网络链接
  • 建立基础UI(导航器,主题等)
  • 从服务器拉取最新内容和其他的更新
  • 建立内存缓存(数据缓存,图片缓存)

这些子系统的厨师户需要大量的时间,并且彼此之间可能相互依赖,加起来要耗费大量的时间。

对于优化我们可以做到:

  1. 确定在展示UI前必须执行的任务
  2. 按顺序执行任务
  3. 将任务拆分为主线程中执行的任务和非主线程的任务,分开执行
  4. 其他的次要任务(日志消息,跟踪事件)在加载UI后执行或异步执行

上述的优化很大程度上依赖于对子系统的控制方式,主要针对崩溃上报。A/B测试,埋点,网络,图片缓存等。其次也可以提供引导图来延长用户使用时间,达到初始化的目的。

冷启动

除了初次启动意外事件,应用的其他启动(点击app图标启动等)期间,可能需要恢复原来的状态,比如,消息的聊天记录,用户上次浏览的文章页面,登陆用户的证书等等。 对于载入之前的状态多数需要从本地缓存加载数据,或者从服务器拉取数据。 一般先是加载旧的数据,最新的数据可用时再更新,将两个数据源同时注入视图中。

热启动

热启动指的是切换一个已经运行的应用。

  1. 应用重启

当用户点击应用图标时,一般不需要执行其他特殊的操作。 应用处于安全状态,或者运行很多动画时,可以监测背景和前景通知。在第一种情况下,应用每次进人前最状态时,都会展示登录界面,在后一种情况下,动画或者游戏状态会被智停,需要恢复。

  1. 深层链接

当应用接收到application:openURL:sourceAppltcation:annotation:回调时,期望能跳转到应用的特定页面,实现用户想要完成的操作。但此时的目标应用可能已经发生变化,处于某一特定状态了。如果深层链接需要从服务器获取数据,那么可以先展示与深层链接相关的原始页面,或者先展示一个进度条,等从服务器获取到了最新数据,再执行刷新操作。

升级后启动

应用升级后的首次启动将遵循下列情形之一:

  • 无本地缓存成应用完全放弃缓存
  • 本地级存可用,可以直接使用或需要切换至升级版本。

如果无本地级存或应用决定放弃缓存(例如,数据不可用或从服务器同步获取更快),则不需要进行特殊处理。

本地数据发生改变时通知用户。以下的最佳实践可以让用户有更好的体验。

  • 如果木地缓存可用,通知用户该情况。如果没有迁移到本地级存的必要,则无需通知用户,因为本地级存的使用是隐式的。
  • 如果必须花几分钟对数据进行迁移,那么向用户展示个可以推迟该操作的选项。
  • 如果从服务器检索数据更快、更容易,因而必须放弃本地缓存的使用,那么这种情况下需要通知用户。

转载于:https://juejin.im/post/5bcad69ef265da0a857aae67

相关文章:

  • Blockathon(2018)上海竞赛项目成果今天揭晓
  • 版本
  • idea的安装和学生申请免费使用
  • Python自动化开发学习-爬虫2
  • hadoop最新发行稳定版:DKHadoop版本选择详解
  • 多路复用实现单服百万级别RPS吞吐
  • 1024,码出未来!
  • 实验5
  • Sql Server内置函数实现MD5加密
  • [Google Guava] 1.1-使用和避免null
  • 资源下载汇总
  • DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
  • 如何修复无法启动的docker容器
  • html----h1-6标签
  • [PHP] 算法-字符串的左循环的PHP实现
  • JavaScript-如何实现克隆(clone)函数
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • avalon2.2的VM生成过程
  • cookie和session
  • ES6之路之模块详解
  • Gradle 5.0 正式版发布
  • Java 23种设计模式 之单例模式 7种实现方式
  • LeetCode18.四数之和 JavaScript
  • Linux各目录及每个目录的详细介绍
  • Lsb图片隐写
  • spark本地环境的搭建到运行第一个spark程序
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • tensorflow学习笔记3——MNIST应用篇
  • vue 配置sass、scss全局变量
  • 彻底搞懂浏览器Event-loop
  • 给新手的新浪微博 SDK 集成教程【一】
  • 批量截取pdf文件
  • 使用common-codec进行md5加密
  • 鱼骨图 - 如何绘制?
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​如何在iOS手机上查看应用日志
  • # include “ “ 和 # include < >两者的区别
  • #pragma pack(1)
  • #QT(串口助手-界面)
  • (4)STL算法之比较
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (JS基础)String 类型
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)Dubbo快速入门、介绍、使用
  • (转)socket Aio demo