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

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

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

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

由于省市区数据超过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;

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


目录
相关文章
|
8月前
|
人工智能 自然语言处理 BI
草料二维码表单功能:轻松收集和管理数据
表单作为草料二维码的高级功能之一,可用于收集格式统一的数据。你可以通过组合姓名、图片、检查项等组件搭建出电子表单,关联到二维码中,扫码填写表单即可更快速、规范的收集数据。 这些数据保存在账号下形成动态档案,可以导出Excel或PDF进行存档;也可以根据企业要求自定义PDF导出格式。
246 2
|
2月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
3月前
|
JavaScript 数据安全/隐私保护
2024了,你会使用原生js批量获取表单数据吗
2024了,你会使用原生js批量获取表单数据吗
61 4
|
3月前
|
JavaScript API
vue尚品汇商城项目-day06【37.获取交易数据+38.用户地址信息展示+39.交易信息展示及交易页面完成+40.提交订单+41.支付组件内获取订单号与展示支付信息】
vue尚品汇商城项目-day06【37.获取交易数据+38.用户地址信息展示+39.交易信息展示及交易页面完成+40.提交订单+41.支付组件内获取订单号与展示支付信息】
47 0
|
移动开发 JavaScript 前端开发
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
218 0
|
前端开发 JavaScript 数据库
layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)
layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)
620 0
|
8月前
|
供应链 API 开发工具
Python实现post请求速卖通商品列表数据接口
Python实现post请求速卖通商品列表数据接口
|
8月前
|
API Python
Python实现post请求虾皮shopee商品列表数据接口
Python实现post请求虾皮shopee商品列表数据接口
1194 0
|
小程序 定位技术
记录一款基于地图标注点展示的微信小程序开发过程纪要
记录整理一款基于地图的微信小程序开发过程,主要涉及标注点展示,可视范围内标注点动态更新,标注点自定义气泡,气泡点击及气泡内容实时更新
134 0
|
数据采集 前端开发 安全
【安全合规】python爬虫从0到1 - ajax的post请求(肯德基餐厅位置查询)
python爬虫从0到1 - ajax的post请求(肯德基餐厅位置查询)
【安全合规】python爬虫从0到1 - ajax的post请求(肯德基餐厅位置查询)

热门文章

最新文章