NSURLSession的用法
阅读原文时间:2023年07月11日阅读:1

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

//[self getTest];

[self postTest];

}

-(void) getTest{

NSURLSession *session = [NSURLSession sharedSession];

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=JSON"];

NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSLog(@"%d",data.length);

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"%@",dict);

}];

[task resume];

}

-(void) postTest{

NSURLSession *session = [NSURLSession sharedSession];

//url = http://120.25.226.186:32812/login?username=123&pwd=123&type=JSON

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod=@"POST";

request.HTTPBody = [@"username=123&pwd=123&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];

NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

NSLog(@"___%@",dict);

}];

[task resume];

}

- (void)downloadTask2
{
NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];

// 1.得到session对象  
NSURLSession \*session = \[NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:\[NSOperationQueue mainQueue\]\];

// 2.创建一个下载task  
NSURL \*url = \[NSURL URLWithString:@"http://localhost:8080/MJServer/resources/test.mp4"\];  
NSURLSessionDownloadTask \*task = \[session downloadTaskWithURL:url\];

// 3.开始任务  
\[task resume\];

// 如果给下载任务设置了completionHandler这个block,也实现了下载的代理方法,优先执行block  

}

#pragma mark - NSURLSessionDownloadDelegate
/**
* 下载完毕后调用
*
* @param location 临时文件的路径(下载好的文件)
*/

  • (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
    {
    // location : 临时文件的路径(下载好的文件)

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    // response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致

    NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

    // 将临时文件剪切或者复制Caches文件夹
    NSFileManager *mgr = [NSFileManager defaultManager];

    // AtPath : 剪切前的文件路径
    // ToPath : 剪切后的文件路径
    [mgr moveItemAtPath:location.path toPath:file error:nil];
    }

/**
* 恢复下载时调用
*/

  • (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
    {

}

/**
* 每当下载完(写完)一部分时就会调用(可能会被调用多次)
*
* @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
    {
    double progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
    NSLog(@"下载进度---%f", progress);
    }

#pragma mark ------------------------------------------------------------------
/**
* 下载任务:不能看到下载进度
*/

  • (void)downloadTask
    {
    // 1.得到session对象
    NSURLSession *session = [NSURLSession sharedSession];

    // 2.创建一个下载task
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/test.mp4"];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    // location : 临时文件的路径(下载好的文件)

    NSString \*caches = \[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject\];  
    // response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致  
    NSString \*file = \[caches stringByAppendingPathComponent:response.suggestedFilename\];
    
    // 将临时文件剪切或者复制Caches文件夹  
    NSFileManager \*mgr = \[NSFileManager defaultManager\];
    
    // AtPath : 剪切前的文件路径  
    // ToPath : 剪切后的文件路径  
    \[mgr moveItemAtPath:location.path toPath:file error:nil\];  

    }];

    // 3.开始任务
    [task resume];
    }