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 的使用(三) 的相关文章

  • iOS 版 Google 地图 SDK 中的热图

    有没有办法添加热图图层适用于 iOS 的 Google 地图 SDK https developers google com maps documentation ios 注意 我指的是存在于Javascript 版本的 Google 地图
  • 扩展中的 Swift 覆盖函数

    如果我有课 class Spaceship
  • iPad 的自适应布局

    我正在关注这篇文章在 ios 中构建自适应布局为 iOS 8 构建自适应用户界面 http www sitepoint com building adaptive user interfaces ios 8 它在 iPhone 上运行良好
  • 在 Mobile Safari 中点击

    敲击
  • 如何在 iOS 11 上的 Swift 中获取 FLAC 文件元数据?

    我需要获取 FLAC 文件的元数据 我尝试了以下代码 let item AVPlayerItem url URL fileURLWithPath path let commonMetadata item asset commonMetada
  • 编程界面方向更改不适用于 iOS

    因此 我有一个项目 当用户按下按钮时 我需要强制改变方向 我创建了一个github 上的示例应用程序 https github com vradenburg ForcedOrientationChange来演示这个问题 interface
  • iOS 8 启动图像文件 - 导航栏和状态栏

    我正在使用 Interface Builder 制作 iOS 8 的启动图像文件 我想要的启动图像非常简单 我认为与 设置 应用程序相同 顶部的导航栏带有一个空的分组 TableView 无标题等 请注意 我通常不使用 Interface
  • 如何在 Objective-C 的动画中使视图振动? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个名为 qShake 的 UIView 当用户犯错误时 我希望该视图在一个小空间内短时间内从左到右晃动 我将如何创建动画来做到这一点
  • NSString 到 TimeInterval

    我有一个 NSString 的格式00 00 00 00最初获得自 dateFormatter setDateFormat HH mm ss SS 我如何获取该字符串并将其转换为 TimeInterval 如果您 100 绝对肯定这种格式永
  • 在 iOS 7 上需要具有非半透明栏的 WantsFullScreenLayout 行为

    我希望能够让我的视图覆盖整个屏幕 位于导航栏和工具栏后面 并将导航栏和工具栏的半透明属性设置为NO 我想要不透明的条 在 iOS 7 之前 这很容易通过设置来完成wantsFullScreenLayout是 然而 在 iOS 7 中 我找不
  • Firebase 查询 - 查找包含字符串的子项

    我在使用 Firebase 查询时遇到了一些问题 我想查询对象 其中对象子值包含特定字符串 到目前为止 我有一些看起来像这样的东西 Firebase ref Firebase alloc initWithUrl https dinosaur
  • 是否可以在不点击的情况下显示多个标记的多个信息窗口?

    我想在谷歌地图中显示多个标记的多个信息窗口 信息窗口应该在不点击标记本身的情况下显示 是否可以 经过研究 我了解到将标记设置为地图视图选定标记可以使信息窗口显示而无需点击它 但是 不能一次选择多个标记作为地图视图的选定标记 有什么可以做的吗
  • UITableView 部分始终保持在视图内

    我有一个包含 3 个部分的 UITableView 第 1 节 该部分的标题是 Players 内容恰好是 1 个单元格 包含 1 4 个玩家姓名的水平列表 第 2 节 该部分的标题是 回合 内容是 X 个单元格 每个单元格包含每个玩家在第
  • 同一视图中的多个 UIAlertView

    我有两个带有确定 取消按钮的 UIAlertView 我通过以下方式捕获用户响应 void alertView UIAlertView alertView didDismissWithButtonIndex NSInteger button
  • 识别用户是否在 iOS 6 设置中定义了本机 Facebook 帐户

    有没有办法通过 FACEBOOK SDK 3 1 和 iOS 6 知道用户是否在 iPhone 设置中定义了其 Facebook 帐户以供本机 Facebook 使用 我想要做的是 当打开我的应用程序时 如果用户在 iPhone 设置中定义
  • 在 Xcode 中查看 TestFlight 崩溃日志

    我已将我的应用程序发送给 TestFlight 的一些外部测试人员 仅当您从 testFlight 安装应用程序时才会出现问题 如果我从 Xcode 安装它 一切都很好 因此 我必须从 iPhone 中删除我的应用程序 并将自己添加为外部测
  • 将 Unmanaged 与 nil 进行比较

    代码是从这篇博客文章复制的 http matthewpalmer net blog 2014 06 21 example ios keychain swift save query http matthewpalmer net blog 2
  • 在 UIScrollView Swift 中禁用垂直滚动

    不要将此问题标记为重复 我读了很多问题 但没有找到问题的答案 我的问题如下 我有一个UIScrollView它应该只水平滚动 这里它垂直滚动 20px 奇怪的事实 它似乎与状态栏的高度相同 我尝试打印内容大小 y 偏移量和高度UIScrol
  • iPhone 应用程序在 iPhone 4 尺寸下运行,更新后出现黑条

    此前 该应用程序支持 iPhone 5s SE 屏幕和 iPhone 6 8 屏幕 不包括加大尺寸 这是使用启动图像完成的 因此 在 Plus 尺寸设备和 iPhone X 设备上 它会在应用程序上方和下方显示黑条 然后我们发布了一个更新
  • 如何在 Swift 中的标签上制作阴影效果?

    我不知道如何在标签上编写阴影代码 我有一个会改变的乐谱标签 因此无法仅对带有阴影的文本进行Photoshop处理 我需要对其进行编码 以便它始终自动在文本后面有一个模糊的阴影 有人可以举一些例子或提供帮助吗 人们说这是重复的 重复 是关于

随机推荐

  • 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