iOS开发Google Protocol Buffer 的使用(三)

2023-11-06

pragma mark - 获取数据

- (void)getData{
	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
	NSString *subServerUrl = [defaults 	objectForKey:@"subURL"];//http://192.168.0.36:8181//api/Department
	//我以前做的时候传的是一个实体类参数NSData *data =[token req]就可以了,可是后来后台让我传两个实体,我想那也挺好做,用数据输出流转化成一个data就好了,但是没有成功(后台无法将这一个data转化成两个data)。这回可难住我了,怎么是好,百度无望,就是我这边想办法以分割的方式传data,我就大胆的在谷歌的第三方里加了一段代码,结果好使了。在最下面我给出了加的代码。
	//一个实体
	UToken *token = [[[[[UToken builder] setToken:[defaults 	objectForKey:@"token"]] setUid:[[defaults objectForKey:@"uid"] intValue]] setMethodName:@"DepartmentALL"] build];
//两个实体
	DepartmentListReq *req = [[[[DepartmentListReq builder] setDepId:0] setIsShowMember:YES] build];
	NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
	[rawOutput open];
	[token writeDelimitedToOutputStream:rawOutput];
	[req writeDelimitedToOutputStream:rawOutput];
	NSData* data = [rawOutput 	propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
	[PBHttpMethod postDataByString:[subServerUrl stringByAppendingString:@"Department"] BODYData:data WithDataBlock:^(id data) {
	DepartmentListRes *res = [DepartmentListRes parseFromData:data];
	_companyName = res.cmpInfo.name;
	[_userdefaults setObject:res.cmpInfo.name forKey:@"companyName"];
	//切记这里加上主线程要不UI界面无法更新(其实这也是个坑)
	dispatch_async(dispatch_get_main_queue(), ^{
	//这里我用了CoreData的本地化存储,用不到可以不刁它。
	NSFetchRequest *fetchRequest = [NSFetchRequest 	fetchRequestWithEntityName:@"Dep"];
	NSArray *allList = [_manager.managedObjectContext executeFetchRequest:fetchRequest error:nil];
	_dataDepArray = [NSMutableArray arrayWithArray:allList];
	for (_dep in _dataDepArray) {
		[_manager.managedObjectContext deleteObject:_dep];
		[_manager saveContext];
	}
	NSFetchRequest *fetchRequest1 = [NSFetchRequest 	fetchRequestWithEntityName:@"Member"];
	NSArray *allList1 = [_manager.managedObjectContext executeFetchRequest:fetchRequest1 error:nil];
	for (_member in allList1) {
		[_manager.managedObjectContext deleteObject:_member];
		[_manager saveContext];
	}
	for (DepRow *deprow  in res.depList) {
		_dep = [NSEntityDescription 	insertNewObjectForEntityForName:@"Dep" inManagedObjectContext:_manager.managedObjectContext];
		_dep.iD = [NSNumber numberWithInt:deprow.id];
		_dep.name = deprow.name;
		_dep.pid = [NSNumber numberWithInt:deprow.pid];
		_dep.isChild = [NSNumber numberWithBool:deprow.isChild];
		_dep.memberCount = deprow.memberCount;
		[_manager saveContext];
		// NSLog(@"------%@", _dep.name);
	}
	for (MemberInfoRes *memres in res.memberList) {
		_member = [NSEntityDescription 		insertNewObjectForEntityForName:@"Member" 		inManagedObjectContext:_manager.managedObjectContext];
		_member.pid = memres.depId;
		_member.name = memres.name;
		_member.mobile = memres.mobile;
		_member.sex = memres.sex;
		_member.post = memres.post;
		_member.email = memres.email;
		_member.phone = memres.phone;
		_member.headPoto = memres.headPoto;
		_member.depName = memres.depName;
		_member.iD = memres.id;
		NSLog(@"->>>>><<<%@", memres.headPoto);
		[_manager saveContext];
	}
	[_userdefaults setObject:@"1" forKey:@"iSContract"];
	[self updateUI];
	[_tableView.mj_header endRefreshing];
	[_tableView.mj_footer endRefreshing];
	});
} WithResponseBlock:^(NSURLResponse *response) {
	NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
	NSInteger responseStatusCode = [httpResponse statusCode];
	if (responseStatusCode != 200) {
		dispatch_async(dispatch_get_main_queue(), ^{
			if (responseStatusCode == 0) {
				DXAlertView *alert = [[DXAlertView alloc]initWithTitle:@"提示" contentText:[NSString stringWithFormat:@"网络请求失败,请检查网络"] leftButtonTitle:nil rightButtonTitle:@"确定"];
				[alert show];
				[_tableView.mj_header endRefreshing];
				alert.leftBlock = ^() {
				NSLog(@"left button clicked");
				};
		}else{
				DXAlertView *alert = [[DXAlertView alloc]initWithTitle:@"提示" contentText:[NSString stringWithFormat:@"服务器异常,请稍后再试"] leftButtonTitle:nil rightButtonTitle:@"确定"];
				[alert show];
				[_tableView.mj_header endRefreshing];
				alert.leftBlock = ^() {
				NSLog(@"left button clicked");
			};
		}
	});
	}
} WithErroBlock:^(NSError *error) {
	if (error) {
		dispatch_async(dispatch_get_main_queue(), ^{
		DXAlertView *alert = [[DXAlertView alloc]initWithTitle:@"提示" contentText:[NSString stringWithFormat:@"解析失败,请稍后再试"] leftButtonTitle:nil rightButtonTitle:@"确定"];
		[alert show];
		[_tableView.mj_header endRefreshing];
		alert.leftBlock = ^() {
		NSLog(@"left button clicked");
		};
	});
	}
}];
}

我做的时候第三方里没有数据输出流分割传数据的方法,久思苦想在Protocol Buffer的
AbstractMessage.m文件里添加了如下方法后好使了:

- (void) writeToOutputStream:(NSOutputStream*) output {
	PBCodedOutputStream* codedOutput = [PBCodedOutputStream streamWithOutputStream:output];
	[self writeToCodedOutputStream:codedOutput];
	[codedOutput flush];
}
- (void) writeDelimitedToOutputStream:(NSOutputStream *)output
{
	int serialized = [self serializedSize];
	PBCodedOutputStream* codedOutput = [PBCodedOutputStream 			streamWithOutputStream:output];
	[codedOutput writeRawVarint32:serialized];
	[self writeToCodedOutputStream:codedOutput];
	[codedOutput flush];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发Google Protocol Buffer 的使用(三) 的相关文章

随机推荐

  • 10000条数据怎么插入比较快

    具体方案 要快速插入10000条数据 以下是一些可行的方法 开启事务 JDBC直接处理 开启事务和关闭事务 耗时差距5倍左右 并且这个倍数会随着数据量的增大而增大 因为在未开启事务时 更新10000条数据 就得访问数据库10000次 导致每
  • FPGA跨时钟域信号处理之亚稳态问题

    FPGA跨时钟域信号处理之亚稳态问题学习笔记 将慢速时钟域 PC 机中的波特率 系统中的 rx 信号同步到快速时钟域 FPGA 中的 sys clk 系统中 所使用的方法叫电平同 步 俗称 打两拍法 跨时钟域会导致 亚稳态 metastab
  • Sonar Java默认的扫描规则

    规则如下 equals should not be used to test the values of Atomic classes equals 方法不应该用在原子类型的数据上 如 AtomicInteger AtomicLong At
  • 宏观内存信息统计

    proc meminfo统计信息解释 linux下内存的统计信息的解释 例如 cat proc meminfo MemTotal 1031016 kB MemFree 13548 kB MemShared 0 kB Buffers 9806
  • 微信小程序(5)-新闻页面制作(1)

    制作如图所示新闻页面 newspage 之导航栏步骤如下 1 在newspage js中定义数据 数据都放在 js中的data内 data newsTitles 要闻 国际 国内 娱乐 体育 科技 视频 2 在newspage wxml中定
  • java.text.ParseException分析

    1 错误 java text ParseException Unparseable date 2018 1 22 14 55 21 2 java text ParseException Unparseable date 2018 1 22
  • C语言操作符详细介绍

    目录 前言 一 原码 反码 补码的基础概念 1 原码 2 反码 3 补码 二 原码 反码 补码的计算方法 1 原码 2 反码 3 补码 三 算术操作符 四 移位操作符 1 左移操作符 移位规则 2 右移操作符 移位规则 1 逻辑移位 2 算
  • 服务器pci光卡 系统不显示,工控机系统读取不到PCI卡的原因及解决办法

    有一次 东田一个客户谈到了以前的工控机出现了系统读取不到PCI卡的问题 其实这样的问题并不常见 但既然存在这样的问题 我们就一起来看看吧 故障的分析和处理 1 先看看在系统设备管理器中有无这个PCI设备的存在 若有 则看驱动和中断是否正常
  • 骚年~来一起撸一撸,这些面试必问的知识

    长按上方小姐姐
  • openGL之API学习(一九六)纹理单元名(纹理对象)和纹理单元的关系

    glGenTextures产生的是一个比较小的整数id 纹理单元名 glActiveTexture激活的是纹理单元号 GL TEXTUREi 它们二者的关系为GL TEXTUREi GL TEXTURE0 id glBindTexture使
  • 【机器学习实战】10、利用PCA来简化数据

    文章目录 13 1 降维技术 13 1 1 主成分分析 PrincipalComponentAnalysis PCA 13 1 2 因子分析 Factor Analysis 13 1 3 独立成分分析 Independent Compone
  • QT如何生成Release版本(得到exe运行DLL)

    1 点击左侧工具栏的 项目 在 构建设置 中 将 编辑构建设置 更改为 Release 特别要注意 概要 中的 Show build 选择框 将勾选去掉 此处主要是选择将生成的文件放置在何处 2 已经生成exe之后 将exe文件单独放置在一
  • 测试开发工程师需要具备的性格

    1 细心 2 耐心 3 时间观念 4 表达能力 5 好奇心 多问几个为什么
  • 【华为OD机试】组成最大数(C++ Python Java)2023 B卷

    题目描述 小组中每位都有一张卡片 卡片上是6位内的正整数 将卡片连起来可以组成多种数字 计算组成的最大数字 输入描述 号分割的多个正整数字符串 不需要考虑非数字异常情况 小组最多25个人 输出描述 最大的数字字符串 用例1 输入 22 22
  • 在虚拟机上安装Ubuntu系统

    打开VMware 点击文件新建虚拟机 选择典型 下一步选择安装系统iso映像文件 安装位置我选择的E盘 保持默认 下一步 点击完成 运行系统后 上下左右键操作 选择中文 简体 回车 选择安装Ubuntu服务器版 语言选择中文 简体 选是 中
  • 字符集详解(一看就懂系列)

    原文请参考 https blog csdn net qq 28098067 article details 53486032 一 编码历史与区别 一直对字符的各种编码方式懵懵懂懂 什么ANSI UNICODE UTF 8 GB2312 GB
  • Qt图形视图框架:QGraphicsScene详解

    一 描述 1 场景提供了一个用于管理大量2D图形项的平面 该类充当图形项的容器 它与视图一起用于可视化2D曲面上的图形图形项 2 场景没有自己的视觉外观 只负责管理图形项 3 场景的最大优势之一就是其快速有效地定位图形项的能力 即使场景中有
  • React导入json数据

    本文提供两种方式 读者根据自己的需要进行选择 1 第一种方式 直接import json文件 这种方式依赖于 json loader模块 npm install json loader https www npmjs com package
  • gs104d键盘使用问题记录

    键盘官网说明 官网说明书 有线开关拨到off 无线拨到on 蓝牙连接 1 开关拨OFF 装电池 拨到ON 指示灯闪一下 只是闪一下不是常亮 2 FN加Q指示灯闪一下 空格右边FN按住再按住P长按 指示灯闪烁 松手 第一个设备打开蓝牙添加搜索
  • iOS开发Google Protocol Buffer 的使用(三)

    pragma mark 获取数据 void getData NSUserDefaults defaults NSUserDefaults standardUserDefaults NSString subServerUrl defaults