NSURLSession 學習筆記
一:NSURLSession
- 類似之前的NSURLConnection, 可配置每個session的 cookie,證書等網絡連接配置信息
NSURLSessionConfiguration
- 包含三大任務 :NSURLSessionTask--(NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask)
- 常用api
@interface NSURLSession : NSObject // 單例 + (NSURLSession *)sharedSession; //配置 Session + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration; + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
/*Data 請求 request */ - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request; /* Data 請求 url. */ - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url; /* 上傳文件請求 fileUrl */ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; /* 上傳Data請求 NSData */ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData; /* 上傳數據流請求 request */ - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request; /* 下載文件.request */ - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request; /* 下載文件 url */ - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url; /* 斷點下載請求 , */ - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
異步請求操作
@interface NSURLSession (NSURLSessionAsynchronousConvenience) /* 異步數據請求 NSData */ - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; /* * 異步文件上傳請求 file,NSData */ - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; /* 異步下載請求 */ - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler; - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler; - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler; @end
二:NSURLSessionTask 任務
- 包含三大任務 :NSURLSessionTask--(NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask)
- 關系圖
系統定義的 常用api,如,對 網絡任務的暫停,繼續
@interface NSURLSessionTask : NSObject <NSCopying> ........ /* 取消任務*/ - (void)cancel; /* 任務狀態*/ @property (readonly) NSURLSessionTaskState state; /*任務暫停和繼續 */ - (void)suspend; - (void)resume; ........ @end
任務狀態:
typedef NS_ENUM(NSInteger, NSURLSessionTaskState) { NSURLSessionTaskStateRunning = 0, /* The task is currently being serviced by the session */ NSURLSessionTaskStateSuspended = 1, NSURLSessionTaskStateCanceling = 2, /* The task has been told to cancel. The session will receive a URLSession:task:didCompleteWithError: message. */ NSURLSessionTaskStateCompleted = 3, /* The task has completed and the session will receive no more delegate notifications */ } NS_ENUM_AVAILABLE(10_9, 7_0);
三大子類,Data,Upload,Download操作 ,都是抽象類,基本不提供任何操作
@interface NSURLSessionDataTask : NSURLSessionTask @end /* * An NSURLSessionUploadTask does not currently provide any additional*/ @interface NSURLSessionUploadTask : NSURLSessionDataTask @end @interface NSURLSessionDownloadTask : NSURLSessionTask /*斷點續傳 */ - (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler; @end
三:演示代碼
1:異步的GET 請求 Data 數據
NSURL *url = [NSURL URLWithString:@"http://httpbin.org/get"]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); }]; //任務創建后,不會立即執行,調用resume 立即執行; [dataTask resume];
2:異步 下載文件
NSURL *url = [NSURL URLWithString:@"http://dl.360safe.com/360zip_setup_3.1.0.2061.exe"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDownloadTask *downTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { //文件下載會被先寫入到一個 臨時路徑 location,我們需要將下載的文件移動到我們需要地方保存 NSURL *savePath = [NSURL fileURLWithPath:@"/Users/user/Desktop/360zip.exe"]; [[NSFileManager defaultManager] moveItemAtURL:location toURL:savePath error:nil]; }]; [downTask resume];
3: 異步上傳文件
NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSData *data = ...; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { // ... }]; [uploadTask resume];