iOS实现一个强大的本地状态记录容器
我们开发中经常会遇到这样的场景,就是我们客户端用户进行了某个操作,这个操作影响了数据的状态,但是我们又不方便重新请求一次数据,
这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂,要记录的状态也越来越多,如果状态都是对应同一个ID还比较好处理,如果不同的状态对应的ID都不是同一个,则管理起来比较麻烦,比如,有些情况下,我们不能根据某条数据的内容ID,而要记录到实例队形的颗粒度,这个时候,就需要我们支持不同的ID来记录本地状态了,
一下是我的处理思路,
我们可以创建一个单例,单例中有一个数组,数组中
有字典,字典中包含三个键: type:对应 id的类型,
ID,对应ID的值,data,对应我们要记录的数据,通常情况下是一个字典,对应我们要记录的状态字段和值,我们获取记录的状态的时候,传入一个ID数组,就会遍历整个容器,获取到对应的ID下的所有数据,如下所示
[
{
“type”:”contentId”,
“id”: “xxxx”
“data”: {
“hasComment”:“0”
}
},
{
“type”:”userId”,
“id”: “xxxx”
“data”: {
“hasComment”:“1”
}
},
{
“type”:”xxxid”,
“id”: “xxxx”
“data”: {
“hasSee”:“1”
}
},
]
具体代码如下
保存本地数据的实现,单例中
- (void)updateData:(NSArray *)newData {NSMutableArray *keysToUpdate = [[NSMutableArray alloc] init];for (NSDictionary *data in newData) {NSString *IDString = [data stringForKey:@"id"];NSString *type = [data stringForKey:@"type"];NSDictionary *templateData = [data dictionaryForKey:@"data"];if (IDString.length <= 0 || type.length <= 0 || templateData.count <= 0) continue;NSUInteger synchronizedTemplateDataToUpdateIndex = 0;NSDictionary *synchronizedTemplateDataToUpdate = nil;for (NSUInteger i = 0; i < self.synchronizedDataList.count; i++) {NSDictionary *synchronizedData = [self.synchronizedDataList objectAtIndex:i];NSString *synchronizedIDString = [synchronizedData stringForKey:@"id"];NSString *synchronizedType = [synchronizedData stringForKey:@"type" ];NSMutableDictionary *synchronizedTemplateData = [[synchronizedData dictionaryForKey:@"data"] mutableCopy];if (![synchronizedIDString isEqualToString:IDString] || ![synchronizedType isEqualToString:type]) continue;for (NSString *key in templateData.allKeys) {NSString *value = [templateData stringForKey:key];[synchronizedTemplateData setObject:value forKey:key];}synchronizedTemplateDataToUpdateIndex = i;synchronizedTemplateDataToUpdate = @{@"id": IDString,@"type": type,@"data": synchronizedTemplateData};break;}if (synchronizedTemplateDataToUpdate == nil) {[self.synchronizedDataList addObject:data];} else {[self.synchronizedDataList removeObjectAtIndex:synchronizedTemplateDataToUpdateIndex];[self.synchronizedDataList addObject:synchronizedTemplateDataToUpdate];}[keysToUpdate addObject:@{@"id": IDString ?: @"",@"type": type ?: @""}];}
更新本地数据
NSMutableDictionary *data = [NSMutableDictionary dictionary];data[@"hasCancelRecommend"] = @(NO);NSString *addressId = [NSString stringWithFormat:@"%p", model];NSDictionary *updateData = @{@"id": addressId ?: @"",@"type": @"modelAddress",@"data": data};[[LBDataSyncDataManager sharedManager] updateData:@[updateData]];
根据所有ID获取本地数据, 单例的实例方法
- (NSDictionary *)getMemoryDataWithKeys:(NSArray *)keys {NSMutableDictionary *getSynchronizedData = [[NSMutableDictionary alloc] init];for (NSString *key in keys) {for (NSDictionary *synchronizedData in self.synchDataList) {NSString *synchronizedIDString = [synchronizedData stringForKey:@"id"];if (![key isEqualToString:synchronizedIDString]) continue;[getSynchronizedData addEntriesFromDictionary:[synchronizedData dictionaryForKey:@"data"]];break;}}return getSynchronizedData;
}
调用,获取到所有的本地状态
NSString *cardInstanceAddress = [NSString stringWithFormat:@"%p", instance];NSDictionary *mergedData = [[LBDataSyncDataManager sharedManager] getMergedDataWithKeys:@[contentID ?: @"", publicID ?: @"", Address ?: @""]];
相关文章:
iOS实现一个强大的本地状态记录容器
我们开发中经常会遇到这样的场景,就是我们客户端用户进行了某个操作,这个操作影响了数据的状态,但是我们又不方便重新请求一次数据, 这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂&…...
【mysql】有索引和没有索引字段更新时锁的不同
结论 对于有索引的的字段作为更新条件,如果更加语句用上了索引,那么只会在对于的更新字段的索引和对于记录的主键索引上加上x锁 如果更新字段没有索引,由于需要全部扫描,那么就会给所有主键索引加上x,导致其他事务的更…...
机器学习的三个基本要素
机器学习的基本要素包括模型、学习准则(策略)和优化算法三个部分。机器学习方法之间的不同,主要来自其模型、学习准则(策略)、优化算法的不同。 模型 机器学习首要考虑的问题是学习什么样的模型(Model&am…...
神经机器翻译:联合学习对齐和翻译
大家读完觉得有帮助记得关注和点赞!!! 摘要 神经机器翻译是最近提出的机器翻译方法。与传统的统计机器翻译不同,神经机器翻译旨在构建一个可以联合调整以最大化翻译性能的单一神经网络。最近为神经机器翻译提出的模型通常属于编码…...
[Web 安全] PHP 反序列化漏洞 —— PHP 魔术方法
关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程,简单编程PHP 中,以两个下划线 ( __ ) 开头方法称之为 「 魔术方法 」 这些 「 魔术方法 」 在 [PHP](/l/yufei/php…...
聆听PostgreSQL数据库的使用
参考:(1)零基础入门PostgreSQL教程 (2)菜鸟教程 文章目录 一、PostgreSQL是什么?二、基本使用1.下载2.操作(1)数据库(2)表 一、PostgreSQL是什么?…...
2025嵌入式软件开发工程师--音频方向
一、选择题(每题3分,共30分) 1.以下哪个不是C语言中的关键字?( ) A. int B. Float C. Define D. Return 2.以下代码的输出是: ( ) inta 5, b 10; printf("%d“, a b); A. 15 B.16 …...
C#释放内存空间的方法
目录 前言释放 C# 对象内存的六种方法1、手动释放内存空间2、使用 Using 语句3、使用 垃圾回收器4、GC.Collect() 方法5、GC.WaitForPendingFinalizers() 方法6、WeakReference 类 注意 前言 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供…...
《鸢尾花数学大系:从加减乘除到机器学习》开源资源
《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML...
如何将一台服务器的pip环境迁移到另一个机器?
在没有网络的情况下,将一台服务器的 pip 环境迁移到另一台机器,可按以下步骤进行操作: 步骤一:在源服务器上导出已安装的包列表 在有网络且已安装所需 Python 包的源服务器上,使用以下命令导出已安装的 Python 包列表: pip freeze > requirements.txt该命令会将当前…...
Java 入门 (超级详细)
一、什么是Java Java是一种高级编程语言,由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点,被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…...
计算机基础面试(数据结构)
1. 数组和链表的区别是什么?各自的优缺点是什么? 专业解答: 数组内存连续,支持随机访问,但插入删除效率低;链表内存离散,插入删除高效,但访问需遍历。 初中生版: 数组像…...
DBGPT安装部署使用
简介 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。 目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mul…...
【蓝桥杯单片机】第十二届省赛
一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…...
开源嵌入式实时操作系统NuttX介绍
一、NuttX RTOS的发展历程:从个人项目到Apache顶级开源项目 NuttX 是一款轻量级、可扩展的实时操作系统(RTOS),其发展历程堪称开源社区的经典案例。 起源与初创(2003-2007) NuttX 由 Gregory Nutt 于2003…...
阿里云服务器部署项目笔记 实操 centos7.9
阿里云服务器部署项目笔记 实操 centos7.9 springboot vue elementUImysqlredis 相关的redis,mysql,nginx镜像,jdk 通过网盘分享的文件:docker镜像 链接: https://pan.baidu.com/s/15VwcWBP4Jy07xADuvylgQw?pwdm2g9 提取码: m2g9 配置环境 连接云服务器 安装…...
Java-实现PDF合同模板填写内容并导出PDF文件
可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…...
Docker安装Grafana数据可视化平台
介绍 Grafana是一个开源的监控和数据可视化平台,主要用于展示和分析时间序列数据。提供功能强大且灵活的数据可视化和监控工具,适用于多种场景,它广泛应用于DevOps、IT运维、物联网(IoT)和业务分析等领域。 Grafana的主…...
MyBatis-Plus 自动填充功能
MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充,帮助开发…...
解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux(centos)系统没有出现这问题,如果你是linux系统碰到的,本文也有一定大参考价值。 根本思路就是:tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
