搜索
您的当前位置:首页正文

OC protobuf(一)初探

来源:二三娱乐

前些日子在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就做好了!

Top