學(xué)習(xí)NSURLSession之前、先擼一遍NSURLSession頭文件里的屬性和API
本文鏈接
NSURLSession
@interface NSURLSession : NSObject
/*
返回系統(tǒng)全局的NSURLSession
*/
@property (class, readonly, strong) NSURLSession *sharedSession;
/*
自定義NSURLSession
通過NSURLSessionConfiguration配置出一個(gè)NSURLSession實(shí)例
區(qū)別:
第一種你只能通過block來去監(jiān)聽任務(wù)的完成等少數(shù)狀態(tài)斗躏。
第二種你可以通過遵循NSURLSessionDelegate協(xié)議來詳細(xì)的監(jiān)聽每一個(gè)步驟静汤、并加以處理。
delegte會(huì)被強(qiáng)引用银择、delegateQueue則是你指定的回調(diào)隊(duì)列.
如果設(shè)定成[NSOperationQueue mainQueue]、那么就會(huì)從主線程回調(diào)了
*/
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;
/*
返回代理的回調(diào)隊(duì)列
如果你不去主動(dòng)設(shè)置delegateQueue(或者設(shè)置成了nil)。
那么每個(gè)session將會(huì)維護(hù)一個(gè)delegateQueue姻政。
*/
@property (readonly, retain) NSOperationQueue *delegateQueue;
/*
返回你為session設(shè)置的代理
*/
@property (nullable, readonly, retain) id <NSURLSessionDelegate> delegate;
/*
返回你為session設(shè)置的代理、如果沒設(shè)置系統(tǒng)會(huì)幫你自動(dòng)生成一個(gè)并且設(shè)置
*/
@property (readonly, copy) NSURLSessionConfiguration *configuration;
/*
session的描述岂嗓。類似于tag或者線程的name吧
*/
@property (nullable, copy) NSString *sessionDescription;
/*
在當(dāng)前task執(zhí)行完畢后關(guān)閉session
對后臺(tái)session無效
*/
- (void)finishTasksAndInvalidate;
/*
直接關(guān)閉 session
會(huì)關(guān)閉所有`未完成`狀態(tài)下的任務(wù)
*/
- (void)invalidateAndCancel;
/*
清空所有的cookie汁展、緩存和憑證存儲(chǔ)、刪除磁盤文件。
*/
- (void)resetWithCompletionHandler:(void (^)(void))completionHandler;
/*
將內(nèi)存中的cookie食绿、證書寫入磁盤侈咕。以后將嘗試新的TCP鏈接
*/
- (void)flushWithCompletionHandler:(void (^)(void))completionHandler;
/*
列出session中所有未完成的task
*/
- (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask *> *uploadTasks, NSArray<NSURLSessionDownloadTask *> *downloadTasks))completionHandler;
/*
列出session中所有未完成的task(查了查也試了試并沒發(fā)現(xiàn)有什么區(qū)別啊~)
*/
- (void)getAllTasksWithCompletionHandler:(void (^)(NSArray<__kindof NSURLSessionTask *> *tasks))completionHandler API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0));
/*
創(chuàng)建一個(gè)掛起狀態(tài)的 task
這種只能是通過代理來捕獲狀態(tài)
需要通過resume來執(zhí)行
*/
/* 通過NSURLRequest、創(chuàng)建NSURLSessionDataTask */
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;
/* 通過NSURL器紧、創(chuàng)建NSURLSessionDataTask */
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
/* 通過NSURLRequest耀销、創(chuàng)建NSURLSessionUploadTask(上傳任務(wù))、需要附帶文件路徑fileURL*/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;
/* 通過NSURLRequest铲汪、創(chuàng)建NSURLSessionUploadTask(上傳任務(wù))熊尉、需要附帶二進(jìn)制文件bodyData*/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData;
/*
通過NSURLRequest、創(chuàng)建NSURLSessionUploadTask(上傳任務(wù))
需要在代理方法URLSession:task:needNewBodyStream:中提供上傳的數(shù)據(jù)流
*/
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;
/* 創(chuàng)建下載任務(wù) */
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;
/* 創(chuàng)建下載任務(wù) */
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;
/*
通過二進(jìn)制文件resumeData創(chuàng)建下載任務(wù)
也就是恢復(fù)下載或者斷點(diǎn)續(xù)傳
比如:
1掌腰、下載失敗后error對象的userInfo字典里有一個(gè)NSURLSession?Download?Task?Resume?Data對應(yīng)的value(如果他可以被恢復(fù)下載)
2狰住、下載被取消/暫停時(shí)、通過task的cancel?By?Producing?Resume?Data:?方法保存已經(jīng)下載的數(shù)據(jù)value
*/
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
/*
通過給定的域名和端口建立雙向TCP/IP連接
*/
- (NSURLSessionStreamTask *)streamTaskWithHostName:(NSString *)hostname port:(NSInteger)port API_AVAILABLE(macos(10.11), ios(9.0), tvos(9.0)) __WATCHOS_PROHIBITED;
/*
通過給定的network service建立雙向TCP/IP連接
*/
- (NSURLSessionStreamTask *)streamTaskWithNetService:(NSNetService *)service API_AVAILABLE(macos(10.11), ios(9.0), tvos(9.0)) __WATCHOS_PROHIBITED;
@end
NSURLSession (NSURLSessionAsynchronousConvenience)
block版task任務(wù)(也都是掛起狀態(tài)的)
@interface NSURLSession (NSURLSessionAsynchronousConvenience)
/*
創(chuàng)建一個(gè)block版本的NSURLSessionDataTask任務(wù)
*/
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
/*
創(chuàng)建一個(gè)block版本的NSURLSessionUploadTask任務(wù)
*/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(nullable NSData *)bodyData completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
/*
創(chuàng)建一個(gè)block版本的NSURLSessionDownloadTask任務(wù)
*/
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
好像沒什么大區(qū)別齿梁、就是沒有StreamedRequest這種以數(shù)據(jù)流形式的上傳方法催植。
@end
最后
本文主要是自己的學(xué)習(xí)與總結(jié)。如果文內(nèi)存在紕漏士飒、萬望留言斧正查邢。如果不吝賜教小弟更加感謝。
參考
《NSURLSession簡介》
《[iOS-Foundation] NSURLSession》
《深入了解NSURLSession》