iOS开发移动端项目中添加protrobuf

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
#import "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{

        }
     }];

就这样吧 累死我了 不会的 直接私聊我 这个技术应该用的公司不多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值