剛剛接觸IOS開發,雖然聽說過AFNetworking等有名的框架,但是由於只是想實現簡單的Get請求,所以決定使用IOS自帶的NSURLSession框架。
1.首先是構建出一個NSURLSession
//構建一個URL
NSURL *url = [[NSURL alloc] initWithString:@"http://..."];
//創建一個request對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:2.0f];
//創建session,並設置委託,用於監聽請求
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self.delegate delegateQueue:[[NSOperationQueue alloc] init]];
2.接下來則是同步請求的寫法
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@ %@ %@ %@", data, response, error, [NSThread currentThread]);
}];
3.異步請求的寫法
//初始化任務
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//發送請求(執行Task)
[dataTask resume];
這裏主要講一下異步請求如何獲取數據
首先先了解一下NSURLSession
的協議NSURLSessionDataDelegate
的兩個委託方法
//接收到服務器端傳輸的數據時的回調方法
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
//按順序拼接服務器傳輸的數據:數據一般分多次返回,每次返回的數據量跟當前的網絡狀態、和 服務器當前正在處理的請求個數有個
[_result appendData:data];
}
/**
* 請求結束或者是失敗的時候調用
* @param session 會話對象
* @param error 錯誤信息
*/
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"接收到得到數據是%@",_result);
//清空數據
[_result resetBytesInRange:NSMakeRange(0, self.result.length)];
_result.length = 0;
}
由於數據量過大是多次接受,而第二個函數又沒有參數可以得到所有數據,因此一般做法是定義一個NSMutableData
變量存獲得的數據存取數據。
4.最後是對數據的處理,這個根據業務各有不同,下面是我對數據解析的一般寫法,講數據轉化爲字典處理
/將字符串寫到緩衝區。
NSString *data = [[NSString alloc] initWithData:_result encoding:NSUTF8StringEncoding];
NSData* jsonData = [data dataUsingEncoding:NSUTF8StringEncoding];
//解析json數據,使用系統方法 JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];