iOS開發(fā)之Protobuf-oc 環(huán)境搭建及使用

一.前言介紹

? ? ? ? 為避免后續(xù)接入 protobuf 功能的iOS開發(fā)人員少走彎路,整理了相關(guān)文檔供參考?。?!

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.時間復雜度

? ? ? ?時間開銷: XML格式化(序列化)的開銷還好;但是XML解析(反序列化)的開銷就不敢恭維了。 但是protobuf在這個方面就進行了優(yōu)化。可以使序列化和反序列化的時間開銷都減短。

4.空間復雜度

? ? ? ?空間開銷:protobuf相比其他傳輸也減少了很多。

5.兼容性

? ? ? ?支持向后兼容和向前兼容,也就是說當客戶端和服務(wù)器同時使用一塊協(xié)議的時候, 當客戶端在協(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了,親測可以!??!

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文件所在的根目錄是哪里, 如果用?.?說明是當前目錄

?--objc_out=.??指出 生成目錄在哪里, 如果用?.?說明是當前目錄

最后跟 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 ?這里看個人習慣執(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容