NSURLSession介紹
NSURLSession在iOS7.0開始引入,在框架中的地位與NSURLConnection并列
NSURLSession能夠完成所有NSURLConnection的功能,并且進行了非常大的功能擴充
從iOS9.0開始,蘋果正式棄用NSURLConnection
下圖為NSURLSession的使用過程涉及到的主要類即它們之間的關系
三種工作模式:
默認會話模式:類似于NSURLConnection,使用磁盤緩存
瞬時會話模式:不使用磁盤緩存
后臺會話模式:在程序進入后臺時也能上傳或下載
NSURLSessionConfigration用于生成這三種工作模式的配置,方法如下
+ (NSURLSessionConfiguration *)defaultSessionConfiguration + (NSURLSessionConfiguration *)ephemeralSessionConfiguration + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier
NSURLSession會話對象的創建:
// 使用默認會話模式、默認的緩存、cookie及credential + (NSURLSession *)sharedSession // 使用指定的工作模式 + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration // 使用指定的工作模式、任務運行時的隊列、代理 + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration*)configuration delegate:(id<NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue
NSURLSession發送網絡請求的使用步驟:
a. 創建任務對象
b. 控制任務的執行
c. 在block或代理方法中獲得任務執行的結果
支持的三種任務:(任務的基類NSURLSessionTask)
數據任務 使用NSURLSessionDataTask描述
下載任務 使用NSURLSessionDownloadTask描述
上傳任務 使用NSURLSessionUploadTask描述
任務對象的
NSURLSession中的任務對象NSURLSessionTask,全部由NSURLSession對象創建
強調:異步操作不會阻塞當前代碼的執行,無法通過返回值或參數獲得結果
NSURLSessionTask任務對象的狀態:
@property(readonly) NSURLSessionTaskState state typedef NS_ENUM (NSInteger, NSURLSessionTaskState ) { NSURLSessionTaskStateRunning = 0, // 運行狀態 NSURLSessionTaskStateSuspended = 1, // 掛起狀態 NSURLSessionTaskStateCanceling = 2, // 取消狀態 NSURLSessionTaskStateCompleted = 3, // 完成狀態 };
當一個任務對象被創建后,任務的狀態為掛起狀態
控制任務執行(修改任務狀態)的方法:
- (void)cancel // 取消任務 - (void)resume // 運行任務 - (void)suspend // 掛起任務
數據任務 — block方式獲得結果
數據任務創建:
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError*error))completionHandler
在block中處理請求后的結果(響應數據、響應對象、錯誤對象)
如:發送一個GET請求,獲取指定游戲任務信息的JSON數據
NSString *urlStr = @"http://localhost/lolShow.php?number=20&from=0"; NSURL * url = [NSURL URLWithString:urlStr]; NSURLRequest * request = [NSURLRequest requestWithURL:url]; //創建數據任務 NSURLSession * session = [NSURLSession sharedSession]; NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error) { if ( error ) { NSLog(@"1 %@", [error localizedDescription]); return ; } //將JSON數據序列化為OC對象 NSArray * arr = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if ( error ) { NSLog(@"2 %@", [error localizedDescription]); return ; } //字典轉模型 for (NSDictionary * dict in arr ) { AMHeroModel * model = [AMHeroModel heroModelWithDict:dict]; [self.heroInfoArray addObject:model]; } [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self stopLoading];//刷新UI }]; }]; //啟動任務 [dataTask resume];
數據任務 — 代理方式獲得結果
數據任務的創建:
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
NSURLSession的代理屬性
@property(readonly, retain) id< NSURLSessionDelegate > delegate
涉及的代理協議: <NSURLSessionDelegate><NSURLSessionTaskDelegate>
<NSURLSessionDataDelegate><NSURLSessionDownloadDelegate>
數據任務常用的代理方法:
//接收到應答對象 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler //接收到數據(可能執行多次) - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveData:(NSData *)data //完成一個請求的應答過程 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。