iOS基礎深入補完計劃--NSURLSession相關API

學習NSURLSession之前、先擼一遍NSURLSession頭文件里的屬性和API

本文鏈接


NSURLSession

@interface NSURLSession : NSObject

/*
    返回系統全局的NSURLSession
 */
@property (class, readonly, strong) NSURLSession *sharedSession;

/*
    自定義NSURLSession
    通過NSURLSessionConfiguration配置出一個NSURLSession實例
    區別:
    第一種你只能通過block來去監聽任務的完成等少數狀態。
    第二種你可以通過遵循NSURLSessionDelegate協議來詳細的監聽每一個步驟、并加以處理。
    delegte會被強引用、delegateQueue則是你指定的回調隊列.
    如果設定成[NSOperationQueue mainQueue]、那么就會從主線程回調了
 */
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;

/*
    返回代理的回調隊列
    如果你不去主動設置delegateQueue(或者設置成了nil)。
    那么每個session將會維護一個delegateQueue。
 */
@property (readonly, retain) NSOperationQueue *delegateQueue;
/*
    返回你為session設置的代理
 */
@property (nullable, readonly, retain) id <NSURLSessionDelegate> delegate;
/*
    返回你為session設置的代理、如果沒設置系統會幫你自動生成一個并且設置
 */
@property (readonly, copy) NSURLSessionConfiguration *configuration;

/*
    session的描述。類似于tag或者線程的name吧
 */
@property (nullable, copy) NSString *sessionDescription;

/* 
    在當前task執行完畢后關閉session
    對后臺session無效
 */
- (void)finishTasksAndInvalidate;

/* 
    直接關閉 session
    會關閉所有`未完成`狀態下的任務
 */
- (void)invalidateAndCancel;
/* 
    清空所有的cookie、緩存和憑證存儲、刪除磁盤文件。
 */
- (void)resetWithCompletionHandler:(void (^)(void))completionHandler;    
/* 
    將內存中的cookie、證書寫入磁盤。以后將嘗試新的TCP鏈接
 */
- (void)flushWithCompletionHandler:(void (^)(void))completionHandler;   
/* 
    列出session中所有未完成的task
 */
- (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask *> *uploadTasks, NSArray<NSURLSessionDownloadTask *> *downloadTasks))completionHandler; 
/* 
    列出session中所有未完成的task(查了查也試了試并沒發現有什么區別啊~)
 */
- (void)getAllTasksWithCompletionHandler:(void (^)(NSArray<__kindof NSURLSessionTask *> *tasks))completionHandler API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0));

/* 
    創建一個掛起狀態的 task
    這種只能是通過代理來捕獲狀態
    需要通過resume來執行
 */

/* 通過NSURLRequest、創建NSURLSessionDataTask */
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;

/* 通過NSURL、創建NSURLSessionDataTask */
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;

/* 通過NSURLRequest、創建NSURLSessionUploadTask(上傳任務)、需要附帶文件路徑fileURL*/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;

/* 通過NSURLRequest、創建NSURLSessionUploadTask(上傳任務)、需要附帶二進制文件bodyData*/
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData;

/* 
    通過NSURLRequest、創建NSURLSessionUploadTask(上傳任務)
    需要在代理方法URLSession:task:needNewBodyStream:中提供上傳的數據流
*/
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;

/* 創建下載任務 */
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;

/* 創建下載任務 */
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;

/* 
    通過二進制文件resumeData創建下載任務 
    也就是恢復下載或者斷點續傳
    比如:
    1、下載失敗后error對象的userInfo字典里有一個NSURLSession?Download?Task?Resume?Data對應的value(如果他可以被恢復下載)
    2、下載被取消/暫停時、通過task的cancel?By?Producing?Resume?Data:?方法保存已經下載的數據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任務(也都是掛起狀態的)

@interface NSURLSession (NSURLSessionAsynchronousConvenience)
/*
    創建一個block版本的NSURLSessionDataTask任務
 */
- (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;

/*
    創建一個block版本的NSURLSessionUploadTask任務
 */
- (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;

/*
    創建一個block版本的NSURLSessionDownloadTask任務
 */
- (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;

好像沒什么大區別、就是沒有StreamedRequest這種以數據流形式的上傳方法。
@end


最后

本文主要是自己的學習與總結。如果文內存在紕漏、萬望留言斧正。如果不吝賜教小弟更加感謝。


參考

《NSURLSession簡介》
《[iOS-Foundation] NSURLSession》
《深入了解NSURLSession》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。