前些日子在swift上玩protobuf,发现苹果实现的SwiftProtobuf性能并不理想,于是打算试试google实现的OC运行时环境性能如何;
一、配置环境
我们需要在mac电脑上安装google的protobuf编译器
$ brew install protobuf
google已经在默认编译器中加入了编译oc的功能,所以不用像swift那样在安装一个代码生成器;
二、编译proto文件
创建一个 DataModel.proto 文件,内容如下:
syntax = "proto3";
message BookInfo {
int64 id = 1;
string title = 2;
string author = 3;
string publishers = 4;
int64 totalPage = 5;
string desc = 6;
}
message MyLibrary {
int64 id = 1;
string name = 2;
repeated BookInfo books = 3;
map<string,string> keys = 4;
string address = 5;
string manager = 6;
string opentime = 7;
}
编译该文件:
$ protoc --objc_out=. DataModel.proto
编译后将生成两个文件:DataModel.pbobjc.h、DataModel.pbobjc.m,这两** 文件是非ARC ,放进项目中时,记得 加上 -fno-objc-arc **;
三、引入protobuf框架到项目中
四、编辑运行
编辑mian.m文件,如下:
#import <Foundation/Foundation.h>
#import "DataModel.pbobjc.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BookInfo *bookInfo = [BookInfo message];
bookInfo.id_p = 10;
bookInfo.title = @"Protobuf";
bookInfo.totalPage = 120;
bookInfo.author = @"Google";
bookInfo.publishers = @"Fuck Publisher";
bookInfo.desc = @"Google do not pay attention in oc protobuf!";
// this data is a protobuf-data format
NSData *data = [bookInfo data];
// protobuf-model can use protobuf-data to create object
BookInfo *bookInfo2 = [[BookInfo alloc] initWithData: data error: NULL];
// [bookInfo2 description] 打印虽然和json很像,但其实不是,小心被坑
NSLog(@"%@", [bookInfo2 description]);
NSLog(@"data: %ld", data.length);
NSLog(@"length: %ld", bookInfo2.description.length);
}
return 0;
}
运行效果如下:
2017-01-17 22:26:53.362384 ProtobufOCDemo[45536:2607746] <BookInfo 0x100408360>: {
id: 10
title: "Protobuf"
author: "Google"
publishers: "Fuck Publisher"
totalPage: 120
desc: "Google do not pay attention in oc protobuf!"
}
2017-01-17 22:26:53.362576 ProtobufOCDemo[45536:2607746] data: 83
2017-01-17 22:26:53.362660 ProtobufOCDemo[45536:2607746] length: 189
聪明如你,上面的代码一应该就懂,这里就不多解释了;
好了,我们OC的第一个protobuf就做好了!