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 ?: @""]];
相关推荐
代码s贝多芬的音符4 小时前
ios android 小程序 蓝牙 CRC16_MODBUS
android·ios·小程序
非专业程序员Ping5 小时前
从0到1自定义文字排版引擎:原理篇
ios·swift·assembly·font
2501_915909065 小时前
“绑定 HTTPS” 的工程全流程 从证书配置到真机验证与故障排查
网络协议·http·ios·小程序·https·uni-app·iphone
2501_915918416 小时前
iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者89 小时前
如何系统化掌握 iOS 26 App 耗电管理,多工具协作
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_9159214310 小时前
运营日志驱动,在 iOS 26 上掌握 App 日志管理实践
android·macos·ios·小程序·uni-app·cocoa·iphone
马拉萨的春天12 小时前
iOS的多线程下数据安全和内存泄漏以及工具使用监测内存泄漏
macos·ios·cocoa·多线程
2501_9151063219 小时前
HTTPS 爬虫实战指南 从握手原理到反爬应对与流量抓包分析
爬虫·网络协议·ios·小程序·https·uni-app·iphone
2501_9160074719 小时前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
非专业程序员Ping1 天前
一文读懂字体文件
ios·swift·assembly·font