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 ?: @""]];

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896827.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue中帶$的是什么

在Vue.js中&#xff0c;帶的 $ 符號用于表示 Vue實例的屬性和方法。 這些屬性和方法是Vue框架內部定義的&#xff0c;主要用于方便開發者在組件內部訪問和使用。 常見的帶$的屬性和方法: ?$data?&#xff1a;用于訪問組件的內部數據對象&#xff0c;包含組件內定義的所有響…

杰和科技工業整機AF208|防塵+靜音+全天候運行

在特殊的工業環境中&#xff0c;實現快速生產離不開各類工業計算機的強大支持。杰和科技工業計算機AF208&#xff0c;作為核心控制單元&#xff0c;憑借其堅固可靠的外殼、先進的散熱技術以及緊湊靈活的部署特點&#xff0c;發揮著關鍵作用。 硬實力外殼&#xff0c;無懼塵埃 …

【django】模型部署過程

模型部署 示例&#xff1a;保存 Scikit-learn 模型myapp/views.py全局加載模型tasks.py&#xff08;Celery任務&#xff09;views.py 修改為異步調用views.py 準備工作 模型保存格式 確保你的模型已保存為可加載的格式&#xff1a; ● TensorFlow/Keras&#xff1a;.h5 或 Save…

一、計算機網絡技術——概述、性能指標

網絡技術發展歷程 第一階段 一九六九年美國國防部研制的ARPANET&#xff0c;采用“接口報文處理機”將四臺獨立的計算機主機互聯在一起&#xff0c;實現數據的轉發。 這一階段的主要特點是TCP/IP協議初步成型 第二階段&#xff1a; 采用三級結構&#xff0c;這一階段的主要…

【向量數據庫Weaviate】與ChromaDB的差異、優劣

以下是 Weaviate 和 ChromaDB 的詳細對比&#xff0c;涵蓋設計目標、核心功能、性能、適用場景及優劣勢分析&#xff1a; 1. 核心定位與設計目標 維度WeaviateChromaDB類型向量數據庫 圖數據庫&#xff08;支持混合搜索&#xff09;輕量級純向量數據庫&#xff08;專注嵌入存…

Lua | 每日一練 (4)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 Lua | 每日一練 (4)題目參考答案線程和協程調度方式上…

Fiji —— 基于 imageJ 的免費且開源的圖像處理軟件

文章目錄 一、Fiji —— 用于科學圖像處理和分析1.1、工具安裝&#xff08;免費&#xff09;1.2、源碼下載&#xff08;免費&#xff09; 二、功能詳解2.0、Fiji - ImageJ&#xff08;Web應用程序&#xff09;2.1、常用功能&#xff08;匯總&#xff09;2.2、Fiji - Plugins&am…

PyQT(PySide)的上下文菜單策略設置setContextMenuPolicy()

在 Qt 中&#xff0c;QWidget 類提供了幾種不同的上下文菜單策略&#xff0c;這些策略通過 Qt::ContextMenuPolicy 枚舉類型來定義&#xff0c;用于控制控件&#xff08;如按鈕、文本框等&#xff09;在用戶右鍵點擊時如何顯示上下文菜單。 以下是 Qt::ContextMenuPolicy 枚舉中…

快慢指針【等分鏈表、判斷鏈表中是否存在環】

一、等分鏈表&#xff1a;找到鏈表的中間節點 Java 實現 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…

系統架構設計師—計算機基礎篇—計算機網絡

文章目錄 網絡互聯模型網絡協議與標準應用層協議FTP協議TFTP協議 HTTP協議HTTPS協議 DHCP動態主機配置協議DNS協議迭代查詢遞歸查詢 傳輸層協議網絡層協議IPV4協議IPV6協議IPV6數據報的目的地址IPV4到IPV6的過渡技術 網絡設計分層設計接入層匯聚層核心層 網絡布線綜合布線系統工…

計算機基礎面試(操作系統)

操作系統 1. 什么是進程和線程&#xff1f;它們的核心區別是什么&#xff1f; 專業解答&#xff1a; 進程是操作系統分配資源的基本單位&#xff0c;擁有獨立的內存空間&#xff1b;線程是進程內的執行單元&#xff0c;共享同一進程的資源。區別在于&#xff1a;進程間資源隔離…

考研408數據結構線性表核心知識點與易錯點詳解(附真題示例與避坑指南)

一、線性表基礎概念 1.1 定義與分類 定義&#xff1a;線性表是由n&#xff08;n≥0&#xff09;個相同類型數據元素構成的有限序列&#xff0c;元素間呈線性關系。 分類&#xff1a; 順序表&#xff1a;元素按邏輯順序存儲在一段連續的物理空間中&#xff08;數組實現&…

【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-1.2.2倒排索引原理與分詞器(Analyzer)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 1.2.2倒排索引原理與分詞器&#xff08;Analyzer&#xff09;1. 倒排索引&#xff1a;搜索引擎的基石1.1 正排索引 vs 倒排索引示例數據對比&#xff1a; 1.2 倒排索引核心結…

Springboot項目本地連接并操作MySQL數據庫

目錄 前提 準備工作 用cmd在本地創建數據庫、表&#xff1a; 1.創建springboot項目&#xff08;已有可跳過&#xff09; 2.編輯Mybatis配置 3.連接數據庫 4.創建模型類&#xff0c;用于與數據庫里的數據表相連 5.創建接口mapper&#xff0c;定義對數據庫的操作 6.創建…

《寶塔 Nginx SSL 端口管理實戰指南:域名解析、端口沖突與后端代理解析》

&#x1f4e2; Nginx & SSL 端口管理分析 1?? 域名解析與 SSL 申請失敗分析 在使用寶塔申請 www.mywebsite.test 的 SSL 證書時&#xff0c;遇到了解析失敗的問題。最初&#xff0c;我認為 www 只是一個附加的前綴&#xff0c;不屬于域名的關鍵部分&#xff0c;因此只為…

java和Springboot和vue開發的企業批量排班系統人臉識別考勤打卡系統

演示視頻&#xff1a; https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能&#xff1a; 管理員管理員工&#xff0c;采集員工人臉特征值存入數據庫&#xff0c;可選擇多個員工批量排班…

DeepSeek學習規劃

DeepSeek是一個專注于深度學習和人工智能技術研究與應用的平臺&#xff0c;旨在通過系統化的學習和實踐&#xff0c;幫助用戶掌握深度學習領域的核心知識和技能。為了在DeepSeek平臺上高效學習&#xff0c;制定一個科學合理的學習規劃至關重要。以下是一個詳細的學習規劃&#…

打開 Windows Docker Desktop 出現 Docker Engine Stopped 問題

一、關聯文章: 1、Docker Desktop 安裝使用教程 2、家庭版 Windows 安裝 Docker 沒有 Hyper-V 問題 3、安裝 Windows Docker Desktop - WSL問題 二、問題解析 打開 Docker Desktop 出現問題,如下: Docker Engine Stopped : Docker引擎停止三、解決方法 1、檢查服務是否…

突破Ajax跨域困境,解鎖前端通信新姿勢

一、引言 在當今的 Web 開發領域&#xff0c;前后端分離的架構模式已經成為主流&#xff0c;它極大地提升了開發效率和項目的可維護性。在這種開發模式下&#xff0c;前端通過 Ajax 技術與后端進行數據交互&#xff0c;然而&#xff0c;跨域問題卻如影隨形&#xff0c;成為了開…

Mercury、LLaDA 擴散大語言模型

LLaDA 參考&#xff1a; https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在線demo&#xff1a; https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在線demo&#xff1a; https://chat.inceptionlabs.ai/ 速度很快生成