原生網絡請求以及AFN網絡請求/異步下載

這裏對網絡請求方式作一個總結。api

原生方式同步GET請求:網絡

1     NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667914&key=e87a054855796995c9e2b48e8514d0da";
2     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
3     NSURL *url = [NSURL URLWithString:urlStr];
4     NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
5     NSURLResponse *response = nil;
6     NSError *error = nil;
7     NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
8     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
9     NSLog(@"%@", responseString);

原生方式異步GET請求:app

1     NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667914&key=e87a054855796995c9e2b48e8514d0da";
2     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
3     NSURL *url = [NSURL URLWithString:urlStr];
4     NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
5     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
6         NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
7         NSLog(@"%@", responseString);
8     }];

可見,請求分爲兩部分,一是構建請求,二是發送請求。構建分爲GET和POST,發送分爲同步和異步。框架

POST請求的請求部分須要將參數構建爲NSData類型:異步

 1     NSString *urlStr = @"http://apis.juhe.cn/mobile/get?";
 2     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
 3     NSURL *url = [NSURL URLWithString:urlStr];
 4     
 5     //建立請求,配置參數的data
 6     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
 7     [request setHTTPMethod:@"POST"];
 8     NSString *otherURLstr = @"phone=13429667914&key=e87a054855796995c9e2b48e8514d0da";
 9     NSData *otherURLData = [otherURLstr dataUsingEncoding:NSUTF8StringEncoding];
10     [request setHTTPBody:otherURLData];

 

原生方式寫出來的代碼老是一坨,下面看看AFN對請求的封裝。AFN須要添加MobileCoreService和SystemConfiguration框架,並在pch里加入頭文件:url

1     #import <MobileCoreServices/MobileCoreServices.h>
2     #import <SystemConfiguration/SystemConfiguration.h>

在使用時須要引入頭文件:spa

1 #import "AFNetworking.h"

GET和POST的請求的構建仍是和前面同樣,發送處:code

1     AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
2     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
3         NSLog(@"%@", operation.responseString);
4     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
5         NSLog(@"%@", [error localizedDescription]);
6     }];
7     [operation start];

AFHTTPRequestOperation是操做隊列的子類,顯然AFN的請求是異步的(固然,既然是操做隊列,就能夠用操做隊列的方法控制它),請求完成後觸發回調。blog

AFN支持自動解析JSON並轉化爲詞典結構:隊列

1     AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
2         NSLog(@"%@", JSON);
3     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
4     }];
5     [operation start];

可是我的不建議使用它解析XML,由於它採用的是XMLParser的方式,很繁瑣。

 

可是這仍是顯得一坨一坨的,因而有兩種辦法,第一種就是再封裝一層簡單的API,就像jQueryAjax同樣,第二種就是每次用的時候複製粘貼啦~

 

使用AFN也能夠很方便地實現文件異步下載:

 1     //目標地址
 2     NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/img/baidu_sylogo1.gif"];
 3     NSURLRequest *request = [NSURLRequest requestWithURL:url];
 4 
 5     //構建AFN操做
 6     AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
 7     
 8     //設置輸出流
 9     NSArray *documents = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
10     NSString *downloadPath = [documents[0] stringByAppendingPathComponent:@"1.gif"];
11     [operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:NO]];
12     
13     //下載過程中的block(檢測進度)
14     [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
15         NSLog(@"下載百分比:%f", (float)totalBytesRead / totalBytesExpectedToRead);
16     }];
17     
18     //下載完成
19     [operation setCompletionBlock:^{
20         NSLog(@"操做完成");
21     }];
相關文章
相關標籤/搜索