1 NSURLConnection網(wǎng)絡(luò)組件(iOS7之前的)
CFNetWork 是一種低層的高性能架構(gòu),它是基于BSD sockets的基礎(chǔ)上做了拓展,是全部網(wǎng)絡(luò)請(qǐng)求組件的父類
2 NSURLSession網(wǎng)絡(luò)組件
iOS7之后,蘋果推出NSURLConnection 的繼任者:NSURLSession
NSURLSession網(wǎng)絡(luò)組件的使用流程
1.構(gòu)造NSURL實(shí)例(鏈接地址)
2.構(gòu)造NSURLRequest請(qǐng)求
3.構(gòu)造NSURLSessionConfiguration(可選)
4.構(gòu)造NSURLSession
5.構(gòu)造NSURLSessionTask
6.構(gòu)造NSURLSession發(fā)送請(qǐng)求
發(fā)送網(wǎng)絡(luò)的基本流程實(shí)例代碼:
//1.????創(chuàng)建URL
URLNSURL *URL = [NSURL URLWithString:@"http://example.com"];
//2.創(chuàng)建request請(qǐng)求對(duì)象
????request????????NSURLRequest *request = [NSURLRequest requestWithURL:URL];
//3.創(chuàng)建URLSession對(duì)象
????URLSession????NSURLSession *session = [NSURLSession sharedSession];
//4.????????????????????????設(shè)置數(shù)據(jù)返回回調(diào)的block
??NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
//data是服務(wù)器返回的數(shù)據(jù)
} ];
//5.發(fā)送請(qǐng)求
[task resume];NSURLRequest
1 NSURLRequest 用于存儲(chǔ)客戶端發(fā)送給服務(wù)器的數(shù)據(jù)包信息和請(qǐng)求設(shè)置
2 NSURLRequest 只有很少的基本設(shè)置選項(xiàng),我大部分使用其子類:NSMutableURLRequest
-
NSURLRequest示例代碼:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
// 設(shè)置請(qǐng)求方式
[request setHTTPMethod:@"POST"];
//設(shè)置超時(shí)時(shí)間
[request setTimeoutInterval:60];
//設(shè)置請(qǐng)求體數(shù)據(jù)
[request setHTTPBody:_data];
//設(shè)置請(qǐng)求頭
[request setValue:@“wxhl-ios" forHTTPHeaderField:@“cookes”];
//設(shè)置緩存策略
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad]; NSResponse
1 NSURLResponse用于存儲(chǔ)服務(wù)器返回的響應(yīng)包數(shù)據(jù)
2 如果發(fā)送的是HTTP請(qǐng)求,那么使用其子類:NSHTTPURLResponse
NSResponse示例代碼:
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//響應(yīng)的狀態(tài)碼
????????????NSInteger statusCode = httpResponse.statusCode;
//??????????響應(yīng)頭信息
NSDictionary *allHeaderFields = httpResponse.allHeaderFields;
//取得響應(yīng)頭中的信息項(xiàng)
????????????????????NSString *contentType = [allHeaderFields objectForKey:@“Content-Type"];
- NSURLSession
1 NSURLSession 指的是一個(gè)網(wǎng)絡(luò)會(huì)話(Session),一個(gè)網(wǎng)絡(luò)會(huì)話可以發(fā)起多個(gè)任務(wù)(Task)
2 一個(gè)任務(wù)(Task)對(duì)應(yīng)了一次網(wǎng)絡(luò)請(qǐng)求
3 Session的類型:
默認(rèn)類型的Session:使用持久化的,基于磁盤的緩存
臨時(shí)的Session:不在磁盤存儲(chǔ)任何數(shù)據(jù),所有的緩存都存儲(chǔ)在內(nèi)存中
后臺(tái)Session:和默認(rèn)類型的Session很像,不同的是有一個(gè)獨(dú)立的進(jìn)程處理所有網(wǎng)絡(luò)請(qǐng)求
NSURLSessionConfiguration
1 +defaultSessionConfiguration 用于創(chuàng)建默認(rèn)類型的Session對(duì)象
2 +ephemeralSessionConfiguration 用于創(chuàng)建臨時(shí)類型的Session對(duì)象
3 +backgroundSessionConfiguration:(NSString *)identifier 用于創(chuàng)建后臺(tái)Session對(duì)象
4 NSURLSessionConfiguration 封裝了很多配置屬性,熟練配置這些屬性,可以讓網(wǎng)絡(luò)請(qǐng)求充分利用其網(wǎng)絡(luò)環(huán)境
requestCachePolicy :緩存策略
networkServiceType:網(wǎng)絡(luò)服務(wù)類型:網(wǎng)絡(luò)流量,網(wǎng)絡(luò)電話,語音,視頻
timeoutIntervalForRequest: 超時(shí)時(shí)間
HTTPAdditionalHeaders: 請(qǐng)求頭
discretionary: 用于后臺(tái)請(qǐng)求,會(huì)把WiFi和電量考慮在內(nèi).
allowsCellularAccess : 是否允許使用蜂窩數(shù)據(jù)
-
NSURLSessionConfiguration創(chuàng)建實(shí)例代碼:
//1.創(chuàng)建session配置對(duì)象 SessionNSURLSessionConfiguration *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration]; //2.創(chuàng)建session對(duì)象 SessionNSURLSession *session = [NSURLSession
sessionWithConfiguration:sessionConfig];
- 網(wǎng)絡(luò)任務(wù)(NSURLSessionTask)
1 一個(gè)Session可以發(fā)起的多個(gè)網(wǎng)絡(luò)請(qǐng)求任務(wù)(Task)
2 三種類型的任務(wù):(Task)
1 數(shù)據(jù)任務(wù)(NSURLSessionDataTask):
數(shù)據(jù)任務(wù)擅長處理小且頻繁的應(yīng)用程序與服務(wù)器之間的請(qǐng)求,
例如:請(qǐng)求JSON數(shù)據(jù),因?yàn)閿?shù)據(jù)任務(wù)不會(huì)將數(shù)據(jù)存儲(chǔ)到磁盤文件中,所以不支持后臺(tái)Session
2 下載任務(wù)(NSURLSessionDownLoadTask):
以文件的形式接收數(shù)據(jù),可以在程序沒有運(yùn)行時(shí)進(jìn)行后臺(tái)下載
3 上傳任務(wù)(NSURLSessionUpLoadTask):
以文件的形式發(fā)送數(shù)據(jù),可以在程序沒有運(yùn)行時(shí)進(jìn)行后臺(tái)上傳
3.1 實(shí)例代碼:
3.11. NSURLSessionDataTask 對(duì)象的創(chuàng)建都是通過Session對(duì)象的方法創(chuàng)建,創(chuàng)建任務(wù)代碼如下:
-
通過 block回調(diào)監(jiān)聽網(wǎng)絡(luò)加載事件
/** 通過request對(duì)象創(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) {
}];
-
代理對(duì)象通過協(xié)議方法監(jiān)聽網(wǎng)絡(luò)事件
NSURLSessionConfiguration *config = [NSURLSessionConfigurationdefaultSessionConfiguration];
//設(shè)置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:configdelegate:self delegateQueue:mainQueue];//1.服務(wù)器返回響應(yīng)頭信息,注意:響應(yīng)頭中數(shù)據(jù)還沒完成 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler //2 響應(yīng)體中的數(shù)據(jù)接收完成 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
3.1.2 上傳文件任務(wù)的創(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ù)請(qǐng)求網(wǎng)絡(luò),請(qǐng)求包必須符合如下格式:
3.1.3 下載任務(wù)的創(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
- 基本的下載任務(wù)
- 下載任務(wù)的監(jiān)聽
- 斷點(diǎn)續(xù)傳下載
- 后臺(tái)下載
·在退出APP時(shí),后臺(tái)的下載任務(wù)仍然進(jìn)行中,一直到下載完成,重新進(jìn)入APP時(shí),才會(huì)觸發(fā)代理方法,拷貝文件
·在后臺(tái)如果沒有下載完成,重新進(jìn)入APP時(shí),下載任務(wù)會(huì)自動(dòng)繼續(xù)
上傳文件到微博
參考發(fā)微博步驟: