省市区三级联动后台接口调用与数据预处理

简介: 省市区三级联动后台接口调用与数据预处理

由于现在经常出现撤县建市,裁撤乡村,大城市把撤县设区以及区划调整,所以需要更新省市区的数据。

解决办法是后台从民政部获取官方省市区数据,录入数据库。后台增加接口让前端调用,获取实时省市区实时数据。

由于省市区数据超过4000条记录,数据量极大,这种实时获取的方式十分费时间和流量。所以要做本地化处理。

把省市区版本号存入系统plist文件([[NSUserDefaults standardUserDefaults] objectForKey:key]),应用启动时,判断版本号是否一致,若不一致清除本地数据,若一致加载本地化数据放入内存,以便于有获取省市区。

在使用的页面判断内存中是否有省市区数据,若没有就调用省市区接口并本地化数据。

当然你若认为把省市区本地化数据加载如内存浪费内存,也使用时获取就可以。一般的手机内存都很大,也不在乎那几百k的内存。

我们需要对获取的后台三级链表数据进行排序和对象化后进行序列化。应用启动时进行反序列化。

接口实现我们采用了ReactiveCocoa (= 2.5)和MJExtension (3.0.17)共有组件。

CBPAddressManagerViewModel.m

CBPAddressManagerViewModel.m

    self.region_listCommand = [[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            CBPAddressManagerAddEntity *entity = input;
            if((entity == nil) || (![entity isKindOfClass:[CBPAddressManagerAddEntity class]]))
            {
                [[BITNoticeView currentNotice] showErrorNotice:@"参数错误"];
                [subscriber sendError:nil];
                return nil;
            }
            self.model = entity;
//            entity.list_row = 20;
            NSMutableDictionary *dic = [NSMutableDictionary dictionary];
//            [dic setSafeObject:self.model.address_id forKey:@"address_id"];
            self.region_listInfoApi.setParams(dic);
            NSLog(@"____________________%@",dic);
            [[BITRequestClient sharedClient] loadDataWithApi:self.region_listInfoApi successBlock:^(NSDictionary *result) {
                @strongify(self);
                if(!isCommonUnitEmptyDict(result))
                {
                    NSArray *array = result[@"data"];
                    if(!isCommonUnitEmptyArray(array))
                    {
                        [self.model.addressDicArr removeAllObjects];
                        for(NSDictionary *dic1 in array)
                        {
                            [self.model.addressDicArr addSafeObject:dic1];
                        }
                        [self processAddress];
                    }
                }
                [subscriber sendNext:self.model];
                [subscriber sendCompleted];
            } failureBlock:^(NSError *error) {
                [[BITNoticeView currentNotice] showErrorNotice:error.domain];
                [subscriber sendError:error];
            }];
            return nil;
        }];
    }];


// 加载地址信息
- (void)processAddress
{
    NSArray*sortedArray = [self.model.addressDicArr sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1,NSDictionary *obj2) {
        return [obj1[@"code"] compare:obj2[@"code"] options:NSNumericSearch];//正序
    }];
    [[PPSingleObject sharedInstance].addressArr removeAllObjects];
    for(NSDictionary *dic1 in sortedArray)
    {
        if(!isCommonUnitEmptyDict(dic1))
        {
            BGChinaAddressEntity *entity1 = [BGChinaAddressEntity mj_objectWithKeyValues:dic1];
            [self.model.addressArr addSafeObject:entity1];
            NSMutableArray *sub1 = dic1[@"sub"];
            if(!isCommonUnitEmptyArray(sub1))
            {
                if(isCommonUnitEmptyString(entity1.pcode))
                {
                    entity1.subFilePath = [NSString stringWithFormat:@"%@-%@", entity1.name, entity1.code];
                }
                else
                {
                    entity1.subFilePath = [NSString stringWithFormat:@"%@-%@-%@", entity1.name, entity1.code,entity1.pcode];
                }
                NSMutableArray *sub3 = [NSMutableArray  array];
                for(NSDictionary *dic2 in sub1)
                {
                    BGChinaAddressEntity *entity2 = [BGChinaAddressEntity mj_objectWithKeyValues:dic2];
                    [sub3 addSafeObject:entity2];
                    if(!isCommonUnitEmptyDict(dic2))
                    {
                        NSMutableArray *sub2 = dic2[@"sub"];
                        if(!isCommonUnitEmptyArray(sub2))
                        {
                            if(isCommonUnitEmptyString(entity2.pcode))
                            {
                                entity2.subFilePath = [NSString stringWithFormat:@"%@-%@", entity2.name, entity2.code];
                            }
                            else
                            {
                                entity2.subFilePath = [NSString stringWithFormat:@"%@-%@-%@", entity2.name,entity2.pcode, entity2.code];
                            }
                            NSMutableArray *sub4 = [BGChinaAddressEntity mj_objectArrayWithKeyValuesArray:sub2];
                            NSArray*sortedArray = [sub4 sortedArrayUsingComparator:^NSComparisonResult(BGChinaAddressEntity *obj1,BGChinaAddressEntity *obj2) {
                                return [obj1.code compare:obj2.code options:NSNumericSearch];//正序
                            }];
                            entity2.sub = [[NSMutableArray alloc] initWithArray:sortedArray];
                        }
                    }
                }
                if(!isCommonUnitEmptyArray(sub3))
                {
                    NSArray*sortedArray = [sub3 sortedArrayUsingComparator:^NSComparisonResult(BGChinaAddressEntity *obj1,BGChinaAddressEntity *obj2) {
                        return [obj1.code compare:obj2.code options:NSNumericSearch];//正序
                    }];
                    entity1.sub = [[NSMutableArray alloc] initWithArray:sortedArray];
//                    NSLog(@"entity1.sub:%lu", (unsigned long)entity1.sub.count);
                }
                
//                [self.province addSafeObject:entity1];
            }
        }
    }
    [PPSingleObject sharedInstance].addressArr = [NSMutableArray arrayWithArray:self.model.addressArr];
    [[PPSingleObject sharedInstance] stroreAddress];
}

加载本地数据:

        if(0 == [PPSingleObject sharedInstance].provinceCityDistrictVersion || (sProvinceCityDistrictVersion != [PPSingleObject sharedInstance].provinceCityDistrictVersion))
        {
            [PPSingleObject clearDataModelWithFileName:sAddressData];
            [[PPSingleObject sharedInstance].addressArr removeAllObjects];
        }
        else
        {
            [[PPSingleObject sharedInstance] loadLocationListDataBSD];
        }

调用后台省市区接口

    if(isCommonUnitEmptyArray([PPSingleObject sharedInstance].addressArr))
    {
        [self excuteRegion_listCommand];
    }
-(void)excuteRegion_listCommand
{
    @weakify(self);
    [[self.viewModel.region_listCommand execute:self.model]subscribeNext:^(id result) {
        @strongify(self);
    } error:^(NSError *error) {
        @strongify(self);
    }];
}
-(CBPAddressManagerAddEntity *)model
{
    if(!_model)
    {
        _model = [[CBPAddressManagerAddEntity alloc]init];
        _model.icon = [UIImage imageNamed:@"right_arrow"];
    }
    return _model;
}

-(CBPAddressManagerViewModel *)viewModel{
    if(!_viewModel)
    {
        _viewModel = [[CBPAddressManagerViewModel alloc]init];
    }
    return _viewModel;
}
@property (nonatomic, strong) CBPAddressManagerViewModel *viewModel;
@property (nonatomic, strong) CBPAddressManagerAddEntity *model;

《省市区三级联动数据本地序列化和反序列化》


目录
相关文章
|
24天前
|
数据采集 前端开发 数据库
实时动态实现省市区三级联动选择器
实时动态实现省市区三级联动选择器
20 0
|
8月前
|
开发者
【 uniapp - 黑马优购 | 商品列表 】如何实现数据获取、结构渲染、自定义组件的封装
【 uniapp - 黑马优购 | 商品列表 】如何实现数据获取、结构渲染、自定义组件的封装
238 0
|
11月前
|
前端开发 JavaScript 数据库
layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)
layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)
491 0
|
11月前
|
移动开发 JavaScript 前端开发
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
161 0
|
1月前
|
小程序 前端开发
实现微信小程序picker 省市区 自定义数据 支持三级联动
实现微信小程序picker 省市区 自定义数据 支持三级联动
120 0
|
1月前
|
API Python
Python实现post请求虾皮shopee商品列表数据接口
Python实现post请求虾皮shopee商品列表数据接口
594 0
|
1月前
|
API Python
Python实现post请求拼多多商品详情数据接口
Python实现post请求拼多多商品详情数据接口
102 0
|
7月前
|
JavaScript 前端开发
前端js上传照片实现可预览功能
前端js上传照片实现可预览功能
35 0
|
10月前
|
消息中间件 API 数据库
细谈商品详情API接口设计
随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要。为了提供更好的用户体验,我们需要设计一套高效、稳定且易于扩展的商品详情API接口。本文将详细探讨商品详情API接口的设计,包括接口的通用性、安全性和扩展性等方面,并附有相应的代码实现。
|
11月前
|
缓存 JSON 监控
深入了解商品详情API接口的使用方法与数据获取
通过详细介绍商品详情API接口的使用方法和步骤,帮助程序员了解如何调用API接口获取淘宝商品的详细信息。同时,提供了实际应用示例和一些注意事项和技巧,希望能够对开发者在实际开发中有所帮助。调用API接口获取商品详情数据是优化和扩展电商业务的关键步骤,希望读者能够通过本文的指导顺利使用商品详情API接口,提升应用程序的功能和性能。

热门文章

最新文章