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实现一个强大的本地状态记录容器
我们开发中经常会遇到这样的场景,就是我们客户端用户进行了某个操作,这个操作影响了数据的状态,但是我们又不方便重新请求一次数据, 这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂&…...
第十四届蓝桥杯:(二分算法)字串简写
这道题我们的做法是开两个vector,分别把a和b字符的下标存进去,然后遍历a字符,我们要求长度必须大于等于k,我们可以画个图,也就是说b的下标减a的下标必须大于等于k-1 也就是b的下标必须大于等于a的下标k-1 我们用二分找…...
制服小程序的“滑手”:禁用页面左右滑动全攻略
哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!😄 没错,我们可以通过设置 disableScroll 属性来“管教”它,同时结合 CSS 样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已…...
java 实现xxl-job定时任务自动注册到调度中心
xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…...
ZK Rollup
ZK Rollup 通过生成零知识证明来确保所有提交的交易都是有效的。生成零知识证明的过程涉及复杂的密码学运算,通常使用的是 zk-SNARK(零知识简洁非互动知识论证)或 zk-STARK(零知识可扩展透明知识论证)。以下是 ZK Roll…...
webstorm的Live Edit插件配合chrome扩展程序JetBrains IDE Support实现实时预览html效果
前言 我们平时在前端网页修改好代码要点击刷新再去看修改的效果,这样比较麻烦,那么很多软件都提供了实时预览的功能,我们一边编辑代码一边可以看到效果。下面说的是webstorm。 1 Live Edit 首先我们需要在webstorm的settings里安装插件Live …...
02 HarmonyOS Next仪表盘案例详解(一):基础篇
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 项目概述2. 技术架构2.1 文件结构2.2 ArkTS 语言特性装饰器的使用 3. 数据结构设计3.1 接口定义3.2 数据初始化 4. 生命周期与页面路由…...
张岳教授:语言模型推理与泛化研究 | ICLR 2025 特邀报告与团队专场
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! AITIME 01 ICLR 2025预讲会特邀报告 AITIME 02 ICLR 2025预讲会西湖大学张岳老师实验室专场 01 AI生成文本的自动化检测 Glimpse: Enabling White-Box Methods to Use Proprietary Models for Zero-Shot LLM-Ge…...
离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用
离散傅里叶变换(DFT)及其在图像处理中的应用 什么是离散傅里叶变换? 离散傅里叶变换(Discrete Fourier Transform, DFT)是一种强大的数学工具,用于将离散信号从时域(或空间域)转换…...
记一次误禁用USB导致键盘鼠标失灵的修复过程
背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...
Apache nifi demo 实验
Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…...
Leetcode 57-插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…...
SpringCloud之Eureka、Ribbon、OpenFeign
目录1. SpringCloud Eureka(服务注册与发现组件)2. SpringCloud Ribbon(负载均衡与服务调用组件)3. SpringCloud OpenFeign(负载均衡与服务调用组件)SpringCloud:用于开发高度可扩展、高性能的分…...
如何在MacOS 10.15上安装Docker Desktop
前文提到MacOS 10.15上无法通过Homebrew安装最新版本的docker,自然想到了去安装更早版本的docker。在MacOS上安装Docker Desktop比安装Docker Engine要更方便一些,具体原因可以自己搜索。通过Docker Desktop的Release notes得知最后一个支持MacOS 10.15的…...
Moticon智能鞋垫传感器OpenGo:经济实用的运动科学研究与临床评估工具
Moticon智能鞋垫传感器OpenGo是运动科学研究领域的一款高性能工具,其无线设计和精准传感器为步态分析、平衡评估以及疾病诊断提供了稳定的数据支持。通过实时捕捉足底压力分布、动态变化及平衡状态,OpenGo 为研究人员和临床医生提供了深入洞察个体运动模…...
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天)
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天) 前言最后 前言 说真的,用Unity工作这几年,经历的项目大大小小,对于场景的渲染算是有一定的经验,但涉及到HDRP高清渲染管线的了解࿰…...
nlp第十节——LLM相关
一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型,从小模型训练出来的概率分布(如自回归模型预测下一个字的概率分布)分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss,与ground label用…...
Flutter管理项目实战
目录: 1、项目的构建和介绍 1、项目的构建和介绍 登录官网下载flutter的zip压缩包,解压到某个文件夹下即可,里面自带sdk的文件,无需再下载;创建项目时选定flutter的sdk的路径即可创建项目完成。 后续待完善࿰…...
智能差旅管理新范式:MyAgent如何重塑企业差旅全流程自动化
在快节奏的商业环境中,企业差旅管理长期面临着流程碎片化、人工操作繁复、合规风险高等痛点。传统模式下,员工需要反复填写纸质表单、逐级跑动审批,财务部门则要耗费大量时间核对票据,这种低效流程每年造成企业平均约15%的差旅管理…...
PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1 中,10 是主要版本,1 是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。 版本号规则: PostgreSQL 10 及以后:版本号…...
UniApp 中封装 HTTP 请求与 Token 管理(附Demo)
目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习,上述实战代码来源:芋道源码/yudao-mall-uniapp 该代码中,通过自定义 request 函数对 HTTP 请求进行了统一管理,并且结合了 Token 认证机制 请求封装原理ÿ…...
@update 的常见用法 Vue.js
在 Vue.js 中,update 是一个事件监听器,通常用于监听自定义组件或某些 Vue 原生组件(如 <input> 或自定义组件)的更新事件。它并不是 Vue 的核心 API,而是一种约定俗成的命名方式,用于处理组件内部状…...
基于开源库编写MQTT通讯
目录 1. MQTT是什么?2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么? MQTT(Message Queuing Terlemetry Transport)消息队列遥测协议;是…...
基于springboot+vue美食与健康分享推广网站
目录 项目介绍 图片展示 运行环境 项目介绍 管理员: 个人中心:修改个人信息、修改密码 美食分类管理:增删改查美食分类 商品分类管理:增删改查商品分类 热门美事管理:增删改查热门美食、以及查看评论、预览视频 在线…...
React面试葵花宝典之二
36.Fiber的更新机制 React Fiber 更新机制详解 React Fiber 是 React 16 引入的核心架构重构,旨在解决可中断渲染和优先级调度问题,提升复杂应用的流畅性。其核心思想是将渲染过程拆分为可控制的工作单元,实现更细粒度的任务管理。以下是其…...
计算机毕业设计SpringBoot+Vue.js装饰工程管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
从波士顿动力到Figure AI:探寻人工智能驱动的机器人智能化
一、引言 1.1 研究背景与意义 在科技飞速发展的当下,机器人智能化已成为全球科技竞争的关键领域,深刻影响着人类社会的生产与生活方式。从工业制造到日常生活服务,从医疗保健到探索未知领域,机器人正逐步渗透进各个行业,展现出巨大的发展潜力与应用价值。其智能化水平的…...
华为 VRP 系统简介配置SSH,TELNET远程登录
华为 VRP 系统简介&配置TELNET远程登录 1.华为 VRP 系统概述 1.1 什么是 VRP VRP(Versatile Routing Platform 华为数通设备操作系统)是华为公司数据通信产品的通用操作系统平台,从低端到核心的全系列路由器、以太网交换机、业务网关等…...
Token相关设计
文章目录 1. 双Token 机制概述1.1 访问令牌(Access Token)1.2 刷新令牌(Refresh Token) 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token(使用 JWT)3.2 解析 Token3.3 登录接口(返回…...
【计算机网络入门】初学计算机网络(九)
目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…...
