iOS ------ 持久化

一,数据持久化的目的

1,快速展示,提升体验

  • 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户

2.节省用户流量

  • 对于较大的资源数据进行缓存,下次展示无需下载消耗流量
  • 同时降低了服务器的访问次数,节约服务器资源

3,离线使用

  • 用户浏览过的数据无需联网,可再次查看
  • 部分功能使用解除对网络的依赖。(百度离线地图,图书阅读器)
  • 无网络时,允许用户进行操作,等到下次联网时同步到服务端

4,记录用户操作

  • 草稿:对于用户需要花费较大成本进行的操作,对用户的每个步骤进行缓存,用户中断操作后,下次用户操作时,直接继续上次的操作
  • 已读内容标记缓存,帮助用户识别那些已读
  • 搜索记录缓存

二,数据持久化方式分类

1,内存缓存

对于使用频率比较高的数据,从网络或者磁盘加载数据到内存中,使用后并不马上销毁,下次使用时直接从内存加载。

内存是指当前程序的运行空间,缓存速度快容量小,是临时存储文件用的,供CPU直接读取。打开一个程序,他是在内存中存储,关闭程序后内存就又回到原来的空闲空间;

  • iOS系统图片加载——[UIImage imageNamed:@“imageName”]
  • 网络图片加载三方库:SDWebImage

2,磁盘缓存

将从网络加载的,用户操作产生的数据写入到磁盘中,用户下次查看,继续操作时,直接从磁盘加载使用。

磁盘是程序的存储空间,缓存容量大、速度慢、可持久化。与内存不同的是磁盘是永久存储东西的,只要里面存放东西,不管运行不运行 ,他都占用空间。

  • 用户输入内存草稿缓存(评论,文本编辑)
  • 网络图片加载第三方库:SDWebImage
  • 搜索历史缓存

三,缓存策略

硬件的存储设施是有限的,仅能存储有限的数据,但我们需要更高的命中率。就需要缓存算法。

  • FIFO(First in First out)

核心思想:一个数据最先进入缓存中,则应该最早淘汰掉。类似实现一个按照时间先后顺序的队列来管理缓存,将淘汰最早访问的数据缓存。

  • LFU(LeastFrequentlyUsed)

记录用户对数据的访问次数,将访问次数多的数据降序排列在一个容器中,淘汰访问次数最少的数据。

  • LRU(LeastRecentlyUsed)

LRU ,该算法维护一个缓存项队列,队列中的缓存项按每项的最后被访问时间排序。当缓存空间已满时,将处于队尾,即删除最后一次被访问时间距现在最久的项,将新的区段放入队列首部。

  • LRU_K (leastRecentlyUsed)

具体来说它多维护一个队列,记录所有缓存数据被访问的历史。仅当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。

  • 2Q (Two queues)

2Q算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列(注意这不是缓存数据的)改为一个FIFO缓存队列,即:2Q算法有两个缓存队列,一个是FIFO队列,一个是LRU队列。

  • MQ(Multiu Queue)

MQ算法根据优先级(访问频率)将数据划分为多个LRU队列,其核心思想是:优先缓存访问次数多的数据

四,数据持久化方案

1,内存缓存

实现内存缓存的技术手段包括苹果官方提供的NSURLCacheNSCache,还有性能和API上比较有优势的开源缓存库YYCachePINCache等。

NSCache
  • NSCache是苹果提供的一套缓存机制,用法和NSMutableDictionary类似,在AFNetworkingSDWebImageKingfisher中都有用到。
  • 当内存不足时NSCache会自动释放内存。NSCache设置缓存对象数量和占用的内存大小,当缓存超出了设置会自动释放内存。
  • NSCacheKey-Value数据结构,通过key来获取缓存对象。
  • NSCache中的数据在APP重启后会消失,因为NSCache只是将数据保存在内存的
  • NSCacheNSMutableDictionary的区别:NSCache是线程安全的,不需要加线程锁,而NSMutableDictionary线程不安全。

2,磁盘缓存

NSUserDefault

适合小规模数据,弱业务相关数据的缓存。

keychain

Keychain是苹果提供的带有可逆加密的存储机制,普遍用在各种存用户名、密码的需求上。另外,Keychain是系统级存储,还可以被iCloud同步,即使App被删除,Keychain数据依然保留,用户下次安装App,可以直接读取,通常会用来存储用户唯一标识串。所以需要加密、同步iCloud的敏感小数据,一般使用Keychain存取。

文件存储
  • Plist:一般结构化的数据可以Plist的方式去持久化
  • archive:Archive方式可以存取遵循协议的数据,比较方便的是存取使用的都是对象,不过中间的序列化和反序列化需要花费一定的性能,可以在想要使用对象直接进行磁盘存取时使用。
  • Stream:指文件存储,一般用来存图片、视频文件等数据
数据库存储

数据库适合存取一些关系型的数据;可以在有大量的条件查询排序类需求时使用。

  • Core Data:苹果官方封装的ORM(Object Relational Mapping)
  • FMDB:github最受欢迎的iOS sqlite 封装开源库之一
  • WCDB:微信团队在自己使用的sqlite封装基础上的开源实现,具有ORM(Object Relational Mapping)的特性,支持iOS、Android。
  • Realm:由Y Combinator孵化的创业团队开源出来的一款跨平台(iOS、Android)移动数据库。
FMDB

FMDB是iOS平台的SQLite的数据库框架,以OC的方式封装了SQLite的C语言API。

优点:

  • 使用起来更加面向对象,省去了很多麻烦冗余的C语言代码
  • 对比苹果自带的Core Data框架,更加轻量级和灵活。
  • 提供了多线程安全的数据库操作方法,有效地防止数据混乱。

FMDB有三个主要的类
FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句。
FMResultSet:使用FMDatabase执行查询后的结果集。
FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的。

// 建表
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT  EXISTS t_test_1 ('%@' INTEGER PRIMARY KEY AUTOINCREMENT,'%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' TEXT NOT NULL, '%@' INTEGER NOT NULL, '%@' FLOAT NOT NULL)", KEY_ID, KEY_MODEL_ID, KEY_MODEL_NAME, KEY_SERIES_ID, KEY_SERIES_NAME, KEY_TITLE, KEY_PRICE, KEY_DEALER_PRICE, KEY_SALES_STATUS, KEY_IS_SELECTED, KEY_DATE];
FMDatabaseQueue *_dbQueue = [FMDatabaseQueue databaseQueueWithPath:@"path"];
[_dbQueue inDatabase:^(FMDatabase *db) {BOOL result = [db executeUpdate:sql];if (result) {//}
}];// 插入一条数据
NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO 't_test_1'(%@,%@,%@,%@,%@,%@,%@,%@,%@,%@) VALUES(\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",%d,%.2f)", KEY_MODEL_ID, KEY_MODEL_NAME, KEY_SERIES_ID, KEY_SERIES_NAME, KEY_TITLE, KEY_PRICE, KEY_DEALER_PRICE, KEY_SALES_STATUS, KEY_IS_SELECTED, KEY_DATE, model.model_id, model.model_name, model.Id, model.Name, model.title, model.price, model.dealer_price, model.sales_status, isSelected,time];
[_dbQueue inDatabase:^(FMDatabase *db) {BOOL result = [db executeUpdate:sql];if (result) {//}
}];// 更新
NSString *sql = @"UPDATE t_userData SET userName = ? , userAge = ? WHERE id = ?";
[_dbQueue inDatabase:^(FMDatabase *db) {BOOL res = [db executeUpdate:sql,_nameTxteField.text,_ageTxteField.text,_userId];if (result) {//}
}];// 删除
NSString *str = [NSString stringWithFormat:@"DELETE FROM t_userData WHERE id = %ld",userid];
[_dbQueue inDatabase:^(FMDatabase *db) {BOOL res = [db executeUpdate:str];if (res) {//}
}];// 查找
[_dbQueue inDatabase:^(FMDatabase *db) {FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM message"];NSMutableArray<Message *> *messages = [[NSMutableArray alloc] init];while ([resultSet next]) {Message *message = [[Message alloc] init];message.localID = [resultSet intForColumnIndex:0];message.content = [resultSet stringForColumnIndex:1];message.createTime = [NSDate dateWithTimeIntervalSince1970:[resultSet doubleForColumnIndex:2]];message.modifiedTime = [NSDate dateWithTimeIntervalSince1970:[resultSet doubleForColumnIndex:3]];[messages addObject:message];}
}];

沙盒储存

沙盒:iOS中每个应用程序都有一个独立的文件夹,这个文件夹就是沙盒。沙盒用来存储app的本地文件,例如:音频、视频、图片文件等。并且每个app的沙盒都是独立的,即当前app没有权限访问其他app的沙盒,所以说沙盒存储较之更安全。

沙盒的层次结构

获取沙盒根目录

NSString *directory = NSHomeDirectory();NSLog(@"directory:%@", directory);

打印结果

/Users/fuchuang/Library/Developer/CoreSimulator/Devices/021352E7-E025-419B-9045-0BA88DD4BE35/data/Containers/Data/Application/3A470BFA-2A06-44E3-879C-34B13DB37A39

获取路径

在这里插入图片描述

  • Documents:保存应用运行的时生成的需要持久化的数据,会被自动备份在iCloud中。
    一般我们在项目中,我们会把一些用户的登录信息以及搜索历史记录等一些关键数据存储到这里。
  • Library:默认存放设置和其他状态信息,除了caches子目录之外其他目录都会被iclude同步。
    • Application Support:此目录包含应用程序用来运行但应对用户隐藏的文件,如游戏的新关卡等文件。
    • Caches:目录用于存储应用程序的缓存数据,比如下载的文件、图像缓存、网络请求缓存等。这些数据可以在应用程序的后续运行中快速访问,以提高性能和用户体验。iOS 系统可能会在设备存储空间紧张时清理 Caches 目录中的文件。Caches 目录中的文件不会被备份到 iCloud,因此适合存储可以重新生成或重新下载的数据
    • Cooikes:系统会自动将App中网络请求的cookie保存为文件。
    • Preferences:保存应用的所有偏好设置。UserDefaults 生成的 plist 文件就会保存该目录下。
    • SplashBoard:存储启动屏缓存,缓存文件格式为 ktx,本质上就是图片,如果启动屏不生效的问题可以考虑从删除该路径下相关缓存文件这个角度解决。
  • SystemData:存放系统数据,无对外暴露的接口。
  • tmp:临时文件夹(系统会不定期删除里面的文件)。

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

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

相关文章

C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗

本文内容来源于B站&#xff1a; 【「观察者模式」与「发布/订阅模式」&#xff0c;你分得清楚吗&#xff1f;】 文章目录 观察者模式&#xff08;Observer Pattern&#xff09;的代码优化观察者模式 与 发布订阅模式 他们是一样的吗&#xff1f;发布订阅模式总结 我们想象这样一…

批量下载 B 站 视频的工具 downkyi

批量下载 B 站 视频的工具 downkyi 亲测好用 图片&#xff1a; 下载地址&#xff1a; https://github.com/leiurayer/downkyi

MES系统在机床产业智能化的作用

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;在机床产业智能化过程中发挥着至关重要的作用。以下是万界星空科技MES系统在机床产业智能化中的几个关键作用&#xff1a; 1. 实时数据采集与分析 数据采集&#xff1a;MES系统通过与生…

jenkins获取sonarqube质量门禁结果

前景 在使用 Jenkins 集成 SonarQube 时&#xff0c;获取质量门禁&#xff08;Quality Gate&#xff09;结果非常重要。SonarQube 的质量门禁是一种质量控制机制&#xff0c;用于评估代码质量是否符合预设的标准。以下是获取质量门禁结果的意义和作用&#xff1a; 评估代码质量…

navicat 17 安装

百度网盘 链接: https://pan.baidu.com/s/1nFFQzWhjxRUM_X6bVlWNGw?pwd8888 提取码: 8888 1.双击运行安装包 2.点击下一步 2.勾选我同意&#xff0c;点击下一步 3.自定义安装路径&#xff0c;点击下一步 4.注意勾选桌面快捷方式&#xff0c;点击下一步 5.点击安装 6.点击完…

[渗透测试学习] Editorial-HackTheBox

文章目录 Editorial-HackTheBox信息搜集漏洞利用权限提升参考文章Editorial-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -sC -v 10.10.11.20扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.7 (Ubuntu Linux; protocol 2.…

组蛋白乳酸化和RNA甲基化如何联动?请大数据把这个思路推给科研人

在细胞生物学中&#xff0c;基因表达调控是决定细胞功能与命运的核心过程之一。组蛋白作为修饰性蛋白&#xff0c;在调控基因转录中起着至关重要的作用。近年来&#xff0c;科学家们发现&#xff0c;组蛋白的多种化学修饰&#xff08;如甲基化、乙酰化、磷酸化等&#xff09;影…

day8 Excel教程——利用数据验证规范单元格输入!(超多干货)

day8 Excel教程——利用数据验证规范单元格输入! 本章目录 day8 Excel教程——利用数据验证规范单元格输入!1. 整数,小数和文本长度1.1 限制用户输入1(最小)和10(最大)之间的数字1.2 限制用户应输入小于或等于3%的小数(百分比)值1.3 限制用户应输入文本长度为18位的身份…

2024年最全数据库开发必备神器:DataGrip 使用介绍

DataGrip 使用介绍 前言 DataGrip 是由 JetBrains 开发的一款专业的数据库管理工具&#xff0c;广泛支持多种数据库系统&#xff0c;如 MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB 等。它提供了强大的 SQL 编辑和调试功能&#xff0c;使数据库开发和管理更加高…

DDR等长,到底长度差多少叫等长?

DDR4看这一篇就够了 - 知乎 (zhihu.com) 【全网首发】DDR4 PCB设计规范&设计要点PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 终于看到较为权威的DDR4等长要求了: !!!! 依据这个要求&#xff0c;H616项目的等长线不合格&#xff1a;

63、ELK安装和部署

一、ELK日志系统 1.1、ELK平台的定义 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana 三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求 E:elasticsearch ES分布式索引型非关系数据库&#xff0c;存…

loguru日志模块:简化Python自动化测试的日志管理!

引言 日志是软件开发中的关键组成部分&#xff0c;为开发和测试人员提供了调试和监控应用程序的重要手段。loguru 是一个第三方的 Python 日志库&#xff0c;以其简洁的 API 和自动化的功能脱颖而出。本文将探讨为什么项目中需要日志&#xff0c;loguru 为何受到青睐&#xff…

书生大模型实战营-基础关-书生大模型全链路开源体系

书生大模型全链路开源体系 书生浦语大模型开源历程书生浦语2.0(InternLM2)体系模型到应用书生浦语开源开放体系 书生浦语大模型开源历程 书生浦语2.0(InternLM2)体系 书生浦语2.0体系&#xff0c;模型大小主要有2种规格&#xff1a; 7B&#xff0c;为轻量级的研究和应用提供了…

【面试】前端开发中的“八股文”:助力还是阻力?

引言 在程序员面试中&#xff0c;“八股文”已经成为一个不可或缺的环节。它通常指的是那些面试中频繁出现的、有固定答案的问题&#xff0c;涉及计算机科学的基础知识、编程语言的特性、以及一些常见的设计模式和算法。然而&#xff0c;围绕“八股文”的争议从未停歇。一方面…

系统设计中15 个最重要的权衡

系统设计的第一法则&#xff1a;一切都与权衡有关。 在设计系统时&#xff0c;我们需要决定要包含哪些功能以及要忽略哪些功能。每次我们做这个决定时&#xff0c;我们都在进行权衡。在本文中&#xff0c;我们将探讨系统设计中遇到的15个最常见的权衡问题&#xff0c;并使用实…

程序员转行大模型:从代码到无限可能

在技术日新月异的时代背景下&#xff0c;许多程序员开始思考自己的职业发展路径。面对着人工智能与机器学习领域的迅速崛起&#xff0c;越来越多的技术人员将目光投向了更为广阔的天地——转行成为大模型研究者或开发者。这一转变不仅要求个人技能的迭代升级&#xff0c;更是一…

数据库一张以时间排好序的表中,找出多次相邻的那些行,如何实现??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

数据结构:线性表(上)

谈到线性的数据结构&#xff0c;那肯定离不开两个最基础的&#xff1a;数组和链表&#xff0c;当然有了数组和链表就会聊到栈和队列。 那么本篇我们就来介绍数组和链表 一、数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统&#xff0c;和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…