Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準。你在http://code.google.com/p/protobuf/downloads/list 上可以下載 Protobuf 的源代碼(然而需要翻牆訪問)。Protocol
Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準。你在http://code.google.com/p/protobuf/downloads/list 上可以下載 Protobuf 的源代碼(然而需要FQ訪問)。Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串列化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。目前提供了 C++、Java、Python 三種語言的 API。也就是說OC版本的 Google本身沒有提供,有哥們說,iOS可以直接用C++版本的,不過作為一個0警告的追求者,我不使用它。
至於為什麼用protobuf,說傻一點,boss讓使用的。說高端一點,傳輸效率高,簡潔。其實就是相同的流量可以傳輸更多的數據。據說wechat也是用的這個。
protobuf-objc在Github上有幾個開源的項目,我用的是這個https://github.com/alexeyxo/protobuf-objc。它裡面的Readme寫的還是很不好理解的,至少我進過坑。然後我發現了他 http://protobuf.io/#objc,這裡面寫的簡潔,字體也比較舒服。
安裝下載
第一種是用命令行下載源碼安裝插件,我喜歡這樣的。
第一行 安裝homebrew 這玩意還是比較有用的,安裝一個無妨 如果這行報錯,看看網路好不好
第二行 安裝automake 下載完源碼你會看到裡面有makefile的,懂得人自然就懂了,不懂得就百度一下咯
第三行 安裝libtool 一個通用庫支持腳本,就看做GCC吧,還是為了make。不懂的還是問度娘
第四行 安裝protobuf
第五行 這一行命令你最好敲一下,不然你會後悔的 後面括弧裡面的就別輸入命令行了
第六行 這個比較費時間
第七行 這是編譯指令,需要你進入你根目錄裡面 下載好的那個protobuf-objc文件夾裡面去執行
第八行 這一行是讓你 把根目錄下那個protobuf-objc文件夾裡面的src目錄下的runtime 裡面的 這個ProtocolBuffers.xcodeproj項目 直接拖到你的項目裡面去,(copy items)
第二種CocoaPods不適合我這種直接的人+_+。。。
第一個方法的1到7 還是要的 後面3行 用pods的如果你不懂的話,面壁思過吧。。。
第三種 其實我發現的更直接的方法,在http://protobuf.io/#objc直接下載最頂上的壓縮包
我不推薦這麼做。如果你這麼做失敗了,那你還是前兩種吧。。。
編譯.proto
安裝好的,畢竟只是工具,用起來才行。proto的語法我就不說了,太多。我這裡假設有人給了你.proto文件,現在你需要把他轉成objc文件。
首先打開終端 cd到Desktop,這樣便於觀察操作結果;
然後輸入這行 protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out=“./pbDir”
紅色的是你的proto文件 我預設放在桌面了;藍色的是你生成的文件要存放的目錄 其中./是指當前目錄下 pbDir 是我新建的文件夾 用來存放生成的objc文件的
每個proto文件會生成兩個文件 一個.h 一個.m
最後將你的生成的文件 拖到你的項目裡面去 然後就可以用了。
簡說proto的Message
proto文件裡面每一個包都是一個message。我寫一個比較全的例子,說明一下。
1 message MTMsg 2 { 3 enum Type 4 { 5 ax = 0; 6 ay = 1; 7 aa = 2; 8 ab = 3; 9 } 10 required Type ntype = 1; 11 repeated TKSMsg objs = 2 ; 12 optional string name = 3 ; 13 }
可以看出,這一個message裡面 有一個枚舉,是不是很神奇。再看第一個變數 它是一個枚舉類型的欄位,前面的required表示它是必填欄位;第二個變數,是一個自定義的TKSMsg(它也是一個message),前面的repeated表示他是一個數組類型;最後一個是一個字元串string,optional表示他是可選欄位。
編譯出來後,這段message會變得很大,我就不貼出來了。
編譯後,你可以用XXXBuilder 來alloc出來一個實例a,對這個a的屬性賦值。然後用這個a.build 給出一個XXX的實例b。這個b可以用來傳輸。