iOS开发移动端项目中添加protrobuf
2016-06-15 14:08
316 查看
iOS开发移动端项目中添加protrobuf
iOS开发需要请求各种接口,后端也有各种各样的协议,传过来的参数也是各种各样:protrobuf
iOS使用protrobuf
protrobuf
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。iOS使用protrobuf
1.protrobuf的数据交换格式是需要iOS前段给后台传入data字节流2.所以我们要把传后台的参数都转换成data
3.正确使用方法以及介绍
(1)现在iOS开发请求框架有很多,比如现在最流行的AFNETWorking,ASIHTTPRequest,还有MK,还有系统本身的NSURLConnection等等很多。
(2)在我们开发的时候如果遇到后台协议是用protrobuf编译出来的协议文件,他会编译成功后给你一套编译好的文件,我们需要把这些文件导入项目中,注意导入后会报错,不要慌,是把文件改成arc的就好了,改好之后还会有报错,不要慌,这是后台是用protrobuf编译出来的 ,那么我们也要导入这个 使用cocoapods
“pod search protrobuf” 搜索到最新的版本就导入到项目中就行。倒入后再编译就不会报错了。这是我们就可以进行请求了。看了后台给你的接口文档之后。算了 不啰嗦了直接上代码;
/`
//创建参数字符串对象 Request13003*request13003=[[Request13003 alloc]init]; //这里我解释一下 这是我们后台定义的协议类,到时候看你们后台怎么定义的你就怎么写,common param都是我们后台定义的到时候看你们怎么定义 后台回给你接口文档下面都是我需要传的参数。 request13003.common.userid=LoginUserInfo.userId; request13003.common.userkey=LoginUserInfo.userKey; request13003.common.cmdid=13003; request13003.common.timestamp=[[NSDate date]timeIntervalSince1970]; request13003.common.platform=2; request13003.common.version=@"1.0.0"; request13003.params.longitude=fromLongitude; request13003.params.latitude=fromLatitude; //这里关键了最后一步要把定义的协议类转换成data NSData*data2=[request13003 data]; //这里关键了 开始请求了昂注意 想用AFNETWorking请求嘛 不好意思请求不到,除非你改底层的框架,为什么请求不到我给大家解释一下,因为点进去AFNetworking (3.1.0) 大家都知道,穿参数的时候都是自定义一个字典去传给后台,后台返回json或者xml。当然这个大框架是不可能不给你传data 的方法。有!但是当你写了传data的方法之后点进去,看到它在底层传data的地方都自动拼接了bour。。。我忘了怎么拼了,这样就蛋疼了, ASI太老了不想用,用系统的吧!不卖官子了直接上代码
//我封装了一个请求类 .h #import <Foundation/Foundation.h> typedef void (^FinishBlock)(NSData *dataString); @interface SendInternet : NSObject<NSURLConnectionDataDelegate> //定义需要的成员变量 @property (strong, nonatomic) NSMutableData *resultData;//保存HTTP结果对象 @property (strong, nonatomic) FinishBlock finishBlock;//回调方法 //该函数相当于是静态方法 不需要实例即可访问 +(void) httpNsynchronousRequestUrl:(NSString*) postUrl postStr:(NSData*)sData finshedBlock:(FinishBlock)block; @end .m #imp a8a2 ort "SendInternet.h" @implementation SendInternet //该方法为异步请求服务器,不用在主线程创建其它线程 +(void) httpNsynchronousRequestUrl:(NSString*) postUrl postStr:(NSData*)sData finshedBlock:(FinishBlock)block { SendInternet *http = [[SendInternet alloc]init]; http.finishBlock = block; //初始HTTP NSURL *url = [NSURL URLWithString:postUrl]; NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url]; [requst setHTTPMethod:@"POST"]; [requst setHTTPBody:sData]; NSLog(@"%@",sData); [requst setTimeoutInterval:15.0]; //连接 NSURLConnection *con = [[NSURLConnection alloc]initWithRequest:requst delegate:http]; NSLog(con ? @"连接创建成功" : @"连接创建失败"); } //收到服务器传输数据的时候调用,此方法根据数据大小执行若干次 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"didReceiveData"); [self.resultData appendData:data]; } //接收到服务器回应的时回调 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"didReceiveResponse"); if (self.resultData == nil) { self.resultData = [[NSMutableData alloc]init]; }else{ [self.resultData setLength:0]; } } //数据传完之后调用此方法 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { if(self.finishBlock != nil) self.finishBlock(self.resultData); } //网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"didFailWithError"); if(self.finishBlock != nil) self.finishBlock(nil); } @end //使用的时候是这样用的 [SendInternet httpNsynchronousRequestUrl:str postStr:data2 finshedBlock:^(NSData *dataString) { //返回的时候需要用这个方法把data传换成response对象简单 Response12002*response12002=[Response12002 parseFromData:dataString error:nil]; //这里是code=0才认定为正常 if (response12002.common.code==0) { } }else{ } }];
就这样吧 累死我了 不会的 直接私聊我 这个技术应该用的公司不多
相关文章推荐
- iOS 单元测试2- OCMock常见使用方式
- iOS 简单的视频直播功能开发(实时视音频流录制编码+RTMP传输+实时拉流解码播放)
- iOS 打包 上架流程
- IOS_app源码
- 6.24AppCan移动开发者大会价值30万的展示机会归了谁?
- 微信公众号自定义菜单中添加图标(转)
- cocos2D-X源码分析之从cocos2D-X学习OpenGL(18)----实例化
- swift PhotoKit学习——swift(学习八)
- 微信消息模板php
- 微信支付:商户订单号重复
- AndroidStudio:断点调试和高级调试
- Spring MVC中的HandlerMapping
- APP启动白屏问题
- Android开发笔记之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
- iOS 单元测试1- 单元测试框架选型
- WebView的使用
- 关于Object=null
- Android实现点击两次返回键退出
- 编译libRTMP(RTMPdump) For iOS
- Android实现界面完全全屏