NSURLSession 學習筆記


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];

 

參考:http://objccn.io/issue-5-4/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM