1 NSURLConnection網(wǎng)絡組件(iOS7之前的)
CFNetWork 是一種低層的高性能架構,它是基于BSD sockets的基礎上做了拓展,是全部網(wǎng)絡請求組件的父類

2 NSURLSession網(wǎng)絡組件
iOS7之后,蘋果推出NSURLConnection 的繼任者:NSURLSession

NSURLSession網(wǎng)絡組件的使用流程
1.構造NSURL實例(鏈接地址)
2.構造NSURLRequest請求
3.構造NSURLSessionConfiguration(可選)
4.構造NSURLSession
5.構造NSURLSessionTask
6.構造NSURLSession發(fā)送請求

發(fā)送網(wǎng)絡的基本流程實例代碼:
//1.????創(chuàng)建URL
URLNSURL *URL = [NSURL URLWithString:@"http://example.com"];
//2.創(chuàng)建request請求對象
????request????????NSURLRequest *request = [NSURLRequest requestWithURL:URL];
//3.創(chuàng)建URLSession對象
????URLSession????NSURLSession *session = [NSURLSession sharedSession];
//4.????????????????????????設置數(shù)據(jù)返回回調(diào)的block
??NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
//data是服務器返回的數(shù)據(jù)
} ];
//5.發(fā)送請求
[task resume];NSURLRequest
1 NSURLRequest 用于存儲客戶端發(fā)送給服務器的數(shù)據(jù)包信息和請求設置
2 NSURLRequest 只有很少的基本設置選項,我大部分使用其子類:NSMutableURLRequest
-
NSURLRequest示例代碼:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
// 設置請求方式
[request setHTTPMethod:@"POST"];
//設置超時時間
[request setTimeoutInterval:60];
//設置請求體數(shù)據(jù)
[request setHTTPBody:_data];
//設置請求頭
[request setValue:@“wxhl-ios" forHTTPHeaderField:@“cookes”];
//設置緩存策略
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; NSResponse
1 NSURLResponse用于存儲服務器返回的響應包數(shù)據(jù)
2 如果發(fā)送的是HTTP請求,那么使用其子類:NSHTTPURLResponse
NSResponse示例代碼:
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//響應的狀態(tài)碼
????????????NSInteger statusCode = httpResponse.statusCode;
//??????????響應頭信息
NSDictionary *allHeaderFields = httpResponse.allHeaderFields;
//取得響應頭中的信息項
????????????????????NSString *contentType = [allHeaderFields objectForKey:@“Content-Type"];
- NSURLSession
1 NSURLSession 指的是一個網(wǎng)絡會話(Session),一個網(wǎng)絡會話可以發(fā)起多個任務(Task)
2 一個任務(Task)對應了一次網(wǎng)絡請求
3 Session的類型:
默認類型的Session:使用持久化的,基于磁盤的緩存
臨時的Session:不在磁盤存儲任何數(shù)據(jù),所有的緩存都存儲在內(nèi)存中
后臺Session:和默認類型的Session很像,不同的是有一個獨立的進程處理所有網(wǎng)絡請求
NSURLSessionConfiguration
1 +defaultSessionConfiguration 用于創(chuàng)建默認類型的Session對象
2 +ephemeralSessionConfiguration 用于創(chuàng)建臨時類型的Session對象
3 +backgroundSessionConfiguration:(NSString *)identifier 用于創(chuàng)建后臺Session對象
4 NSURLSessionConfiguration 封裝了很多配置屬性,熟練配置這些屬性,可以讓網(wǎng)絡請求充分利用其網(wǎng)絡環(huán)境
requestCachePolicy :緩存策略
networkServiceType:網(wǎng)絡服務類型:網(wǎng)絡流量,網(wǎng)絡電話,語音,視頻
timeoutIntervalForRequest: 超時時間
HTTPAdditionalHeaders: 請求頭
discretionary: 用于后臺請求,會把WiFi和電量考慮在內(nèi).
allowsCellularAccess : 是否允許使用蜂窩數(shù)據(jù)
-
NSURLSessionConfiguration創(chuàng)建實例代碼:
//1.創(chuàng)建session配置對象 SessionNSURLSessionConfiguration *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration]; //2.創(chuàng)建session對象 SessionNSURLSession *session = [NSURLSession
sessionWithConfiguration:sessionConfig];
- 網(wǎng)絡任務(NSURLSessionTask)
1 一個Session可以發(fā)起的多個網(wǎng)絡請求任務(Task)
2 三種類型的任務:(Task)
1 數(shù)據(jù)任務(NSURLSessionDataTask):
數(shù)據(jù)任務擅長處理小且頻繁的應用程序與服務器之間的請求,
例如:請求JSON數(shù)據(jù),因為數(shù)據(jù)任務不會將數(shù)據(jù)存儲到磁盤文件中,所以不支持后臺Session
2 下載任務(NSURLSessionDownLoadTask):
以文件的形式接收數(shù)據(jù),可以在程序沒有運行時進行后臺下載
3 上傳任務(NSURLSessionUpLoadTask):
以文件的形式發(fā)送數(shù)據(jù),可以在程序沒有運行時進行后臺上傳

3.1 實例代碼:
3.11. NSURLSessionDataTask 對象的創(chuàng)建都是通過Session對象的方法創(chuàng)建,創(chuàng)建任務代碼如下:
-
通過 block回調(diào)監(jiān)聽網(wǎng)絡加載事件
/** 通過request對象創(chuàng)建,RequestcompletionHandler:數(shù)據(jù)加載完成回調(diào)block*/NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {}];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
-
代理對象通過協(xié)議方法監(jiān)聽網(wǎng)絡事件
NSURLSessionConfiguration *config = [NSURLSessionConfigurationdefaultSessionConfiguration];
//設置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:configdelegate:self delegateQueue:mainQueue];//1.服務器返回響應頭信息,注意:響應頭中數(shù)據(jù)還沒完成 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler //2 響應體中的數(shù)據(jù)接收完成 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
3.1.2 上傳文件任務的創(chuàng)建:
// fileURL:上傳文件的路徑
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest*)requestfromFile:(NSURL *)fileURLcompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler
// fromDatadata:上傳文件的data
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest
*)requestfromData:(NSData *)bodyDatacompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler
上傳任務請求網(wǎng)絡,請求包必須符合如下格式:

3.1.3 下載任務的創(chuàng)建:
// location
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest*)requestcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)urlcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler
// resumeData: - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData
*)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler
- 基本的下載任務
- 下載任務的監(jiān)聽
- 斷點續(xù)傳下載
- 后臺下載
·在退出APP時,后臺的下載任務仍然進行中,一直到下載完成,重新進入APP時,才會觸發(fā)代理方法,拷貝文件
·在后臺如果沒有下載完成,重新進入APP時,下載任務會自動繼續(xù)
上傳文件到微博
參考發(fā)微博步驟: