轉自http://www.cnblogs.com/soley/p/5483673.html
iOS7之后請求變化
1. NSURLSession:
- 在WWDC 2013中,Apple的團隊對NSURLConnection進行了重構,并推出了NSURLSession作為替代
- 支持后臺運行的網絡任務
- 暫停、停止、重啟網絡任務,不再需要 NSOpation 封裝
- 請求可以使用同樣的配置容器
- 不同的 session 可以使用不同的私有存儲,block和代理可以同時起作用
- 直接從文件系統上傳、下載
- 為了方便程序員使用,蘋果提供了一個全局 session
- 所有的 任務(Task) 都是由 Session 發起的
- 所有的任務默認是掛起的,需要 Resume
2. GET請求(Block)
// 方式一:使用block實現
// 創建url
NSURL *url = [NSURL URLWithString:GET_URL];
// 創建NSURLSession對象
NSURLSession *session = [NSURLSession sharedSession];
// 創建task請求任務,通過URL初始化task,在block內部可以直接對返回的數據進行處理
// NSURLSession是基于任務去完成相關的事件的
// NSURLSessionTask所有的任務均放在這個里邊實現
// 對數據進行加載:使用NSURLSessionDataTask和NSURLSessionTask兩者沒有本質區別
// 要處理下載任務的時候使用此任務:NSURLSessionDownloadTask
// 要處理上傳任務使用:NSURLSessionUploadTask
NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 解析數據
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", dict);
}];
// 啟動任務(NSURLSessionTask實例出來的任務處于掛起狀態,如果不啟動,不會走block中的實現內容)
[task resume];
3. GET請求(協議Delegate)
NSURL *url = [NSURL URLWithString:GET_URL];
// 創建session
// 參數1:模式的設置(默認會話模式(default),瞬時會話模式(ephemeral),后臺會話模式(background))
// 參數2:代理
// 參數3:主線程隊列
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 創建task任務
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
[task resume];
#pragma mark - NSURLSessionDataDelegate協議的實現方法
// 接受服務器響應
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
// 允許服務器響應(只有允許了才會接受到數據)
completionHandler(NSURLSessionResponseAllow);
// 當網絡請求是基于http協議時(url以http開頭),response本質為NSHTTPURLResponse(可寫可不寫)
// NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//初始化data,稍后進行片段的拼接存儲
self.resultData = [NSMutableData data];
}
// 接受數據拼接
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
// 反復執行,然后拼接相關的片段
[_resultData appendData:data];
}
// 數據接受完成,網絡請求結束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
// 解析
if (error == nil) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.resultData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", dic);
}
}
4. POST請求(Block)
// 創建url
NSURL *url = [NSURL URLWithString:POST_URL];
// 創建請求
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:[POST_BODY dataUsingEncoding:NSUTF8StringEncoding]];
// 通過request初始化task
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@", dict);
}];
[task resume];
5. POST請求(協議Delegate)
NSURL *url = [NSURL URLWithString:POST_URL];
// 創建session
// 參數1:模式的設置(默認會話模式(default),瞬時會話模式(ephemeral),后臺會話模式(background))
// 參數2:代理
// 參數3:主線程隊列
NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];
[mRequest setHTTPMethod:@"POST"];
[mRequest setHTTPBody:[POST_BODY dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 創建task任務
NSURLSessionDataTask *task = [session dataTaskWithRequest:mRequest];
[task resume];
// 協議部分與GET相同