一、Protocol buffers 是什么?
优点是更小更快;且对于数据扩展兼容性好,因为新增数据字段不影响旧字段解析;语义清晰且学习门槛低;
如果想详细了解可戳这:protobuf.dev
二、怎么使用
这里先介绍如何将.proto文件转换成.pbobjc.h和.pbobjc.m文件,然后导入到项目中,并实现pbData转pbModel,pbModel转pbData
切记一定要安装3.0以上的版本,才支持OC,而且功能更好用;
推荐使用Homebrew来安装:
brew install automake
brew install libtool
brew install protobuf
安装后check一下,可输出当前安装版本
protoc --version
准备好这些后,
- 集成集成protobuf库
pod 'Protobuf'
- 将.proto文件转换成.pbobjc.h和.pbobjc.m文件
先cd到.proto文件所在目录,然后执行如下操作,会在同级目录里生成.pbobjc.h和.pbobjc.m文件;
protoc --proto_path=. --objc_out=. xxxx.proto
注意: 这里生成的.pbobjc.h和.pbobjc.m文件无法直接导入项目中使用,你会发现文件中一堆MRC的代码;
参考如下:iOS 组件中设置文件支持MRC
至此,项目build是可以success的,接下来是如何使用
- pbModel转pbData
pb提供了一个data方法,可将使用上面步骤导入项目的pbobjc类也可以理解成model类转换成data
/**
* Serializes the message to an NSData.
*
* If there is an error while generating the data, nil is returned.
*
* @note This value is not cached, so if you are using it repeatedly, cache
* it yourself.
*
* @note In DEBUG ONLY, the message is also checked for all required field,
* if one is missing, nil will be returned.
*
* @return The binary representation of the message.
**/
- (nullable NSData *)data;
如下示例,xxpbModel就是代表一个pbobjc类
NSData *pbData = [xxpbModel data];
- pbData转pbModel
pb提供了一个init方法来将一个data映射成pbobjc类
/**
* Initializes an instance by parsing the data. This method should be sent to
* the generated message class that the data should be interpreted as. If
* there is an error the method returns nil and the error is returned in
* errorPtr (when provided).
*
* @note In DEBUG builds, the parsed message is checked to be sure all required
* fields were provided, and the parse will fail if some are missing.
*
* @note The errors returned are likely coming from the domain and codes listed
* at the top of this file and GPBCodedInputStream.h.
*
* @param data The data to parse.
* @param errorPtr An optional error pointer to fill in with a failure reason if
* the data can not be parsed.
*
* @return An initialized instance of the generated class.
**/
- (nullable instancetype)initWithData:(NSData *)data
error:(NSError **)errorPtr;
如下示例,生成一个pbobjc类对象或者说一个pbModel
XXPbModel 是一个pbobjc类名
NSError *error;
XXPbModel *pbModel = [[XXPbModel alloc] initWithData:data error:&error];