搜索
您的当前位置:首页正文

NSURLSession(get,post,下载,代理方法,显示

来源:二三娱乐

get请求

- (void)get
{
    NSURLSession *session = [NSURLSession sharedSession];
    // 1. 方式一:
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"get请求地址"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
    // 2. 方式二: 如果想设置request就用这个
//    session dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>
    
    // 启动任务
    [task resume];
}

post请求

- (void)post
{
    
    NSURLSession *session = [NSURLSession sharedSession];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"post请求地址"]];
    
    request.HTTPMethod = @"POST";
    
    // 请求体
    request.HTTPBody = [@"username=zhangsan&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
    
    [[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
    }] resume];

}

下载

- (void)downLoad
{
    NSURLSession *session = [NSURLSession sharedSession];
    
    // 默认下载到temp文件夹下, 如果不做操作, 就会被移除
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"文件的下载地址"] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 文件将来存放的地址
        // suggestedFilename 服务器中的文件名
        NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        
        // 剪切location路径下的临时文件到以后文件存放的地址
        NSFileManager *mgr = [NSFileManager defaultManager];
        [mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
    }];
    
    [task resume];
}

data的代理方法(和NSURLConnect相似)

#import "ViewController.h"

/**
 *  这里的代理, 根据你后面的操作来选择 (NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate)等代理
 */
@interface ViewController () <NSURLSessionDataDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // session的代理是只读的,所以只能创建的时候设置
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
    // 创建任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"网络地址"]]];
    
    // 启动任务
    [task resume];
    
}

#pragma mark - NSURLSessionDataDelegate
/**
 *  1. 接受到服务器的响应
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSLog(@"%s",__func__);
    // 这里根据响应头中的消息, 再来判断是否符合要求, 是否继续执行接受数据
    // 默认为不接受数据,取消任务
    // 如果响应头符合要求, 执行completionHandler block,则继续执行2,3步
    completionHandler(NSURLSessionResponseAllow);
}

/**
 *  2. 接受到服务器的数据 (调用多次)
 */

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"%s",__func__);

}

/**
 *  3. 请求成功完成或者失败都调用这个方法(如果失败,error有值)
 */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"%s",__func__);

    if (error) {
        NSLog(@"请求失败");
    } else{
        NSLog(@"请求完成");
    }
}

大文件显示进度的下载

#import "ViewController.h"

/**
 *  这里的代理, 根据你后面的操作来选择 (NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate)等代理
 */
@interface ViewController () <NSURLSessionDownloadDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // session的代理是只读的,所以只能创建的时候设置
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
    // 创建任务
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"下载地址"]];
    
    // 启动任务
    [task resume];
}

#pragma mark - NSURLSessionDownloadDelegate

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"%s",__func__);
    
    if (error) {
        NSLog(@"请求失败");
    } else{
        NSLog(@"请求完成, 数据接收完毕");
    }
}

/**
 *  每当写入数据到临时文件时,就会调用一次(会调用多次)
 *  @param bytesWritten              这次写入的大小
 *  @param totalBytesWritten         已经写入的总大小
 *  @param totalBytesExpectedToWrite 总大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    NSLog(@"------%f", 1.0 * totalBytesWritten / totalBytesExpectedToWrite);
}

/**
 *  下载完毕会调用一次这个方法
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    // 文件将来存放的地址
    // suggestedFilename 服务器中的文件名
    NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    
    // 剪切location路径下的临时文件到以后文件存放的地址
    NSFileManager *mgr = [NSFileManager defaultManager];
    [mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
}
Top