iOS 如何使用protocol Buffers

一、Protocol buffers 是什么?

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data -- think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
Protocol buffers 是 Google 的语言中立、平台中立、可扩展的序列化结构化数据机制 - 类似于 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码,使用各种语言轻松地在各种数据流中写入和读取结构化数据。

优点是更小更快;且对于数据扩展兼容性好,因为新增数据字段不影响旧字段解析;语义清晰且学习门槛低;

如果想详细了解可戳这:protobuf.dev

二、怎么使用

这里先介绍如何将.proto文件转换成.pbobjc.h和.pbobjc.m文件,然后导入到项目中,并实现pbData转pbModel,pbModel转pbData

Protocol buffers 开源并托管在Github,详见https://github.com/google/protobuf/
google提供了pb转oc的方法,但是没有提供swift的,apple这里做了swift的使用,详见https://github.com/apple/swift-protobuf

切记一定要安装3.0以上的版本,才支持OC,而且功能更好用;

推荐使用Homebrew来安装:

c 复制代码
brew install automake 
brew install libtool 
brew install protobuf

安装后check一下,可输出当前安装版本

c 复制代码
protoc --version

准备好这些后,

  1. 集成集成protobuf库
c 复制代码
 pod 'Protobuf'
  1. 将.proto文件转换成.pbobjc.h和.pbobjc.m文件

先cd到.proto文件所在目录,然后执行如下操作,会在同级目录里生成.pbobjc.h和.pbobjc.m文件;

c 复制代码
protoc --proto_path=. --objc_out=. xxxx.proto

注意: 这里生成的.pbobjc.h和.pbobjc.m文件无法直接导入项目中使用,你会发现文件中一堆MRC的代码;

参考如下:iOS 组件中设置文件支持MRC

至此,项目build是可以success的,接下来是如何使用

  1. pbModel转pbData

pb提供了一个data方法,可将使用上面步骤导入项目的pbobjc类也可以理解成model类转换成data

c 复制代码
/**
 * 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类

c 复制代码
NSData *pbData = [xxpbModel data];
  1. pbData转pbModel

pb提供了一个init方法来将一个data映射成pbobjc类

c 复制代码
/**
 * 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类名

c 复制代码
NSError *error;
XXPbModel *pbModel = [[XXPbModel alloc] initWithData:data error:&error];
相关推荐
2501_916007475 小时前
申请 iOS 推送证书并配置 APNs 群发推送教程
android·ios·小程序·https·uni-app·iphone·webview
weixin_403810136 小时前
iOS自动化脚本怎么避免风控?无屏幕镜像截图原理详解
ios·自动化·跨境电商·苹果群控·苹果投屏·多媒体运营
wangruofeng6 小时前
3 步把 MacBook 变成 7×24 远程主机,人在外面随时接管桌面
ios·agent·mac
weixin_403810137 小时前
iOS免越狱自动化蓝牙HID方案:不装代理也能跑脚本
运维·ios·自动化·跨境电商·ai智能体·ios投屏·苹果投屏
GitLqr18 小时前
Flutter 3.47 与 Dart 3.13:你必须了解的迁移指南
flutter·ios·dart
冯汉栩1 天前
Swift Control View,Label渐变颜色(源码)
开发语言·ios·swift
jike_20261 天前
iPhone日历查看会议纪要APP推荐:按日期查找历史录音更方便
ios·语音识别·iphone
冯汉栩1 天前
OC 技术 App上存蒲公英教程
ios
码云之上2 天前
小程序 iOS 多输入框焦点乱序脱坑记
ios·微信小程序·taro
2501_915909062 天前
iOS test 测试怎么做?功能、性能、兼容、稳定与安全五类测试指南
android·ios·小程序·https·uni-app·iphone·webview