iOS实现一个强大的本地状态记录容器

devtools/2025/3/6 16:41:03/

我们开发中经常会遇到这样的场景,就是我们客户端用户进行了某个操作,这个操作影响了数据的状态,但是我们又不方便重新请求一次数据,
这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂,要记录的状态也越来越多,如果状态都是对应同一个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 ?: @""]];

http://www.ppmy.cn/devtools/165034.html

相关文章

stm32week5

stm32学习 二.外设 14.串口发送数据包 数据包的定义&#xff1a; HEX数据包(以0xFF为包头&#xff0c;0xFE为包尾&#xff0c;实际上可自定义)&#xff1a; 固定包长&#xff0c;含包头包尾可变包长&#xff0c;含包头包尾 对于数据中不会出现包头包尾的数据可以用可变包长…

RK3588开发笔记-fiq_debugger: cpu 0 not responding, reverting to cpu 3问题解决

目录 前言 一、FIQ Debugger介绍 二、rockchip平台配置方法 三、问题分析定位 IRQF_NOBALANCING 的含义 总结 前言 在进行 RK3588 开发的过程中,我们可能会遇到各种棘手的问题。其中,“fiq_debugger: cpu 0 not responding, reverting to cpu 3” 这个错误出现在RK3588的…

LLM大型语言模型(一)

1. 什么是 LLM&#xff1f; LLM&#xff08;大型语言模型&#xff09;是一种神经网络&#xff0c;专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络&#xff0c;通常训练于海量文本数据上&#xff0c;有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …

【图像阈值分割、区域分割、边缘分割】

图像阈值分割、区域分割、边缘分割 目录 图像阈值分割、区域分割、边缘分割目标知识点1. 图像分割概述2. 阈值分割&#xff08;Thresholding&#xff09;3. 基于区域的分割&#xff08;Region-based Segmentation&#xff09;4. 基于边缘的分割&#xff08;Edge-based Segmenta…

C++知识整理day11——二叉搜索树(二叉搜索树的插入、查找、删除及完整代码实现)

文章目录 1.二叉搜索树的概念2.二叉搜索树的性能分析3.二叉搜索树的接口设计3.1 二叉搜索树的插入3.2 二叉搜索树的查找3.3 二叉搜索树的删除3.4 代码实现 1.二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;为什么这么说呢&#xff0c;我们学过就知道&#xff0c;对二…

Expo:快速验证跨平台应用的工程化方案

对于资源受限的中小团队和独立开发者&#xff0c;跨平台开发常面临双端环境配置、原生API调用等高门槛。Expo通过**托管工作流&#xff08;Managed Workflow&#xff09;**提供开箱即用的解决方案&#xff1a;预置React Native运行时、统一构建工具链&#xff08;expo-cli&…

迷你世界脚本世界接口:World

世界接口&#xff1a;World 彼得兔 更新时间: 2024-06-04 09:40:40 具体函数名及描述如下: 序号 函数名 函数描述 1 isDaytime(...) 是否为白天 2 isCustomGame(...) 是否为自定义游戏 3 isCreativeMode(...) 是否为创造模式 4 isGodMode(...) …

【Elasticsearch】节点设置(Node Settings)是用于定义和管理集群中每个节点的行为和角色的关键配置

在 Elasticsearch 中&#xff0c;节点设置&#xff08;Node Settings&#xff09;是用于定义和管理集群中每个节点的行为和角色的关键配置。节点设置决定了节点的功能、资源分配以及与其他节点的交互方式。以下是关于 Elasticsearch 节点设置的详细说明&#xff0c;结合了之前提…