現在的學習基本脫離了那幾本教程,
上個禮拜正式著手代碼編寫。
同事UI弄得比較快,於是我只好寫寫網路通訊,資料來源模型設計以及加解密。
這邊簡單的說下常用的第三方網路程式庫以及,以及json資料協議格式的簡單使用。
先引入目前網上點擊率最高的關於這個使用的文章(源文不詳,呵呵)
ASIHTTPRequest類庫簡介和使用說明
我只是簡單說下一般項目中會用到的最基礎一部分,有的東西都是用著用著就熟了,犯不著一開始記住那麼多,然後沒有實踐都會慢慢忘掉,
我比較喜歡先簡單看下,在頭腦中形成一個類似於一個索引目錄,不知道細節沒關係,我們有了索引就可以去查閱資料嘛。
先準備下ASIHttpRequest的一些下載和添加。
1.,我是在github上下的,地址https://github.com/pokeb/asi-http-request/
2.然後吧源檔案拖進去項目,添加:CFNetwork.framework,.framework, MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib。上面文章都有介紹。
然後我們簡單看下一個最簡單的非同步請求。
包含一個url地址,一個request,一個delegate。
@implementation NLNetHelper+ (void)startRequesWithContent:(NSObject *)model delegte :delegte{ //step 1: 根據code判斷是佛要3des加密 NSString *code = [model getMethidCode]; NSLog(@"code是!!!!!!%@",code); if (code == @"10000") { } //step 2:head和body組裝成jsonString NLHead *head = [[NLHead alloc] init]; // head // NSString *urlString = [NSString stringWithFormat:@"%@%@.do",baseURL,code]; NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setPostBody:nil]; [request setDelegate:delegte]; [request startAsynchronous]; //step1. 模型解析}
代碼直接項目中測試類別拷貝的,主要看下面的4-5句。
因為在Android編寫習慣性會把我們自己的網路處理類封裝在一起。
但是ios中看了很多demo,發現請求參數處理以及request以及response返回的處理都在ViewController中處理~
一眼看上去是方便多了,不用定義一些類似於bean類型的類來管理我們要設定進去一些屬性值,用於最後轉化成請求參數在網路層處理,
而是很直接的手動拼裝起來。
因為這第一個項目,也不知道ios有木有這樣的習慣,就是ViewController類中基本處理了當前頁面的所有邏輯操作~因為看過一個我們外包版本的項目
一個ViewController代碼2,3千行~~
好了,我的意思是有需要的可以自己書寫一個netManager,parseHelper等等的類。
在Android中非同步操作一般子線程然後handler來處理。
ios暫時沒接觸多線程這塊。非同步請求,對於返回以及何時返回,返回錯誤,用了代理這方法。
因為我們都知道非同步這個概念,直白點就是,MainThread新起一個SubThread,子線程處理完東西後,一是用所謂的Handler神馬的機制來通知主線程,
或者是經典的的回呼函數嘛。而代理類,協議啊介面,正式有部分這樣的性質不是嗎?
@optional// These are the default delegate methods for request status// You can use different ones by setting didStartSelector / didFinishSelector / didFailSelector- (void)requestStarted:(ASIHTTPRequest *)request;- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;- (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;- (void)requestFinished:(ASIHTTPRequest *)request;- (void)requestFailed:(ASIHTTPRequest *)request;- (void)requestRedirected:(ASIHTTPRequest *)request;// When a delegate implements this method, it is expected to process all incoming data itself// This means that responseData / responseString / downloadDestinationPath etc are ignored// You can have the request call a different method by setting didReceiveDataSelector- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;// If a delegate implements one of these, it will be asked to supply credentials when none are available// The delegate can then either restart the request ([request retryUsingSuppliedCredentials]) once credentials have been set// or cancel it ([request cancelAuthentication])- (void)authenticationNeededForRequest:(ASIHTTPRequest *)request;- (void)proxyAuthenticationNeededForRequest:(ASIHTTPRequest *)request;
以上就是所有的可選的帶了方法,看意思就明白。
好了,以上只是ASIHttpRequest中部分的功能,基本就能解決我們一般網路類應用中大部分的功能了吧。
二:SBJson使用
雖然現在看到說sdk5.0以上,已經整合了json解析庫。同時貌似說效能還高,但是,可能我們的現在的應用還要相容下5.0以下的版本。
反正這些都是需要我們客觀看待然後主觀舍取。
SBJSon同樣的一個第三方包
1. https://github.com/stig/json-framework
我們都知道,json的格式就是key value。
說白了json格式就是一種帶著特性的String字竄。
我們把我們要的資料群組裝成這樣的字竄床底給服務端,然後服務端返回同樣這樣字竄的資料,我們要解析然後提取出內容來。
看過java我們都知道,其實裡面是map的遍曆。
同樣的,在ios,我們需要先定義一個字典,然後把需要傳遞的資料以索引值對存入,然後調用json解析器產生jsonString。
同樣,也會有個還原序列化咯。
[dictionary JSONRepresentation]; 字典產生jsonString。
NSMutableDictionary *dic = [jsonString JSONValue]; jsonString轉化成字典
其實相對於ios上的,java中其實封裝的更加完美。能直接操作javabean-》jsonString。
因為用了反射,後來查了下,貌似ios也是有反射這內容啊~
為什麼說bean—>jsonString呢。
因為,大部分,比如我們一個使用者登陸通訊,我們會設計一個LoginBean,包含兩個欄位 username和password,然後是setter,getter方法。
當然,不用bean,直接在ViewCotroller中把name啊password設定如dic中,因為我看了幾個demo版本都這樣~,甚至我們外包的那個項目也是這麼搞。
好了,反正簡單來說。
資料轉化,如果使用了類似於bean的自訂類,那麼bean—》dic—>jsonString。反解析時同樣。
因此我的處理是:
-(NSString *)bean2jsonString{ NSMutableDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: partnerCode, @"partnerCode", version, @"version", prov,@"prov", mobile,@"moblie", methodId,@"methodId", userId,@"useId", [NSDictionary dictionaryWithObjectsAndKeys:postTime, @"postTime",md5Sign,@"md5Sign",nil],@"other", nil]; return [dictionary JSONRepresentation];}- (void)jsonString2Bean:(NSString *)jsonString{ NSMutableDictionary *dic = [jsonString JSONValue]; NSString *partnerCodeString = [NSString stringWithFormat:@"修改過的%@",[dic objectForKey:@"partnerCode"]]; [self setPartnerCode:partnerCodeString]; }
該方法是在bean中。反正覺得沒有Android中json用起來方便,你扔個標準bean對象,就給你出來一個jsonString。
其實也是很簡單的兩塊內容,剛做了,記錄下。下面準備調通下加密這塊,分享和借鑒