一.前言介紹
? ? ? ? 為避免后續(xù)接入 protobuf 功能的iOS開發(fā)人員少走彎路,整理了相關(guān)文檔供參考S势ā6丝恰!
1.背景簡介
? ? ? ? ?ProtoBuf (Google Protocol Buffer)是由google公司用于數(shù)據(jù)交換的序列結(jié)構(gòu)化數(shù)據(jù)格式晃洒,具有跨平臺、跨語言朦乏、可擴展特性球及,類型于常用的XML及JSON,但具有更小的傳輸體積、更高的編碼、解碼能力栗精,特別適合于數(shù)據(jù)存儲沿彭、網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)葘Υ鎯w積镊尺、實時性要求高的領(lǐng)域朦佩。以 .proto為后綴,有自己的編譯器 protoc, protoc2 和 protoc3 版本
2.主要用途
? ? ? ? 主要用于結(jié)構(gòu)化數(shù)據(jù)串行化的靈活鹅心、高效吕粗、自動的方法,有如XML旭愧,不過他更小,更快宙暇,也更簡單输枯。你可以定義自己的數(shù)據(jù)結(jié)構(gòu),然后使用代碼生成器生成的代碼來讀寫這個數(shù)據(jù)結(jié)構(gòu)占贫。甚至可以在無需重新部署程序的情況下更新數(shù)據(jù)結(jié)構(gòu)桃熄。
3.時間復(fù)雜度
? ? ? ?時間開銷: XML格式化(序列化)的開銷還好;但是XML解析(反序列化)的開銷就不敢恭維了型奥。 但是protobuf在這個方面就進行了優(yōu)化瞳收。可以使序列化和反序列化的時間開銷都減短厢汹。
4.空間復(fù)雜度
? ? ? ?空間開銷:protobuf相比其他傳輸也減少了很多螟深。
5.兼容性
? ? ? ?支持向后兼容和向前兼容,也就是說當(dāng)客戶端和服務(wù)器同時使用一塊協(xié)議的時候烫葬, 當(dāng)客戶端在協(xié)議中增加一個字節(jié)界弧,并不會影響客戶端的使用
二.環(huán)境搭建
1.下載protobuf
使用git的方式到開源社區(qū)下載protobuf,在終端種輸入以下命令:
git clone?https://github.com/google/protobuf.git
2.安裝brew
ruby -e "$(curl -fsSL ?https://raw.githubusercontent.com/Homebrew/install/master/install)"
此處會下載多個插件,大概需要執(zhí)行3-5分鐘左右
PS:執(zhí)行這一步的時候可能會error443 connect報錯搭综,這個時候你不要心慌垢箕,只需將mac上的終端大退重新從第一步開始執(zhí)行就ok了,親測可以6医怼L趸瘛!
3.使用brew安裝protoc
brew install protobuf
4.安裝 automake
brew install automake
brew install libtool
5.將ProtoBuf協(xié)議文件編譯為OC文件
protoc --proto_path=. --objc_out=. UpDriverPosition.proto
protoc 為proto的生成指令 后面添加 參數(shù)
參數(shù)的形式為: --參數(shù)命令名=參數(shù)
?--proto_path=.??指出proto文件所在的根目錄是哪里, 如果用?.?說明是當(dāng)前目錄
?--objc_out=.??指出 生成目錄在哪里, 如果用?.?說明是當(dāng)前目錄
最后跟 proto文件的名稱,
需要注意的事 proto 里面需要指出pb語法的版本; 如??syntax = "proto2";??有??optional??關(guān)鍵字 說明是??proto2?版本
生成的?.h?語?.m?文件 只能使用OC的MRC模式,暫時不支持ARC.所以剛添加到項目 報錯很正常.
三.通過cocopods安裝Protobuf插件
在prodfile加入 pod 'Protobuf', '3.11.4'
執(zhí)行pod setup ----> pod install ?這里看個人習(xí)慣執(zhí)行命令就好了(關(guān)于cocopods安裝和命令處理這里不過多解釋)
執(zhí)行完以后Pods下面會多出一個Protobuf文件蒋歌,就可以愉快的上代碼了
四.demo核心代碼
在Person.proto中寫入:
syntax?= "proto3";
message?Person {
? ? string name = 1;
? ? int64 age = 2;
? ? string gender = 3;
}
終端執(zhí)行命令生成 .h. .m文件帅掘,將文件拖拽到工程中后續(xù)使用
#import "ViewController.h"
#import "Person.pbobjc.h"
@interface?ViewController ()
@property?(nonatomic,?strong) Person *person;
@end
@implementation?ViewController
#pragma mark?- Life Cycle
- (void)viewDidLoad {
? ? [super?viewDidLoad];
? ? [self?testProtobuf];
}
- (void)testProtobuf {
NSLog(@"%@",?self.person);
? ? NSData *personData = [self?encode:self.person];
? ? NSLog(@"%@", personData);
? ? Person *decodeObj = [self?decode:personData];
? ? NSLog(@"%@", decodeObj);
? ? decodeObj.name = @"Tom";
? ? NSLog(@"%@", decodeObj);
}
#pragma mark?- Private Methods
- (nullable?NSData *)encode:(Person *)person {
?return?[person data];
}
- (nullable?Person *)decode: (nonnull?NSData *)data {
?return?[Person parseFromData:data error:nil];
}
#pragma mark?- Lazy Methods
- (Person *)person {
?if?(!_person) {
? ? ? ? _person = [Person new];
? ? ? ? _person.name = @"Carson";
? ? ? ? _person.age = 27;
? ? ? ? _person.gender = @"Male";
? ? }
?return?_person;
}
@end