NSURLSessionDataTask

本文介绍了一个iOS应用中实现图片下载及显示下载进度的方法。使用NSURLSession进行图片资源的下载,并通过UIProgressView来实时更新展示下载进度。此外,还实现了下载任务的暂停、继续和取消等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDelegate,NSURLSessionTaskDelegate,NSURLSessionDataDelegate>

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@property (weak, nonatomic) IBOutlet UIProgressView *progress;

@property (nonatomic,strong) NSURLSession * session;

@property (nonatomic,strong) NSURLSessionDataTask * dataTask;

@property (nonatomic,strong) NSMutableData * imageData;

@property (nonatomic,assign) long long length;

@end

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad]; 

}

-(NSURLSession *)session{

    if (_session == nil) {

        NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];

        self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    }

    return _session;

}

-(NSURLSessionDataTask *)dataTask{

    if (_dataTask ==nil) {

        NSURL * url = [NSURL URLWithString:@"http://img1.3lian.com/2015/a1/124/d/181.jpg"];

        self.dataTask = [self.session dataTaskWithURL:url];

    }

    return _dataTask;

} 

- (IBAction)suspendenButtonDidClicked:(UIButton *)sender {

    if (self.dataTask.state == NSURLSessionTaskStateRunning) {

        [self.dataTask suspend];

    }

}

- (IBAction)resumeButtonDidClicked:(UIButton *)sender {

    [self.dataTask resume];

} 

- (IBAction)cancelButtonDidClicked:(UIButton *)sender {

    if (_dataTask) {

        if (self.dataTask.state == NSURLSessionTaskStateRunning||NSURLSessionTaskStateSuspended) {

            [self.dataTask cancel];

            self.dataTask=nil;

            self.session = nil;

            [self.progress setProgress:0 animated:NO];

        }

    }

} 

//获取服务器返回的响应信息

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{

    //转换

    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;

    NSLog(@"%@",[httpResponse allHeaderFields]);

    //获取资源大小

    self.length = httpResponse.expectedContentLength;

    NSLog(@"responce"); 

    if (_length!=-1) {

        //继续下载或上传

        self.imageData = [NSMutableData dataWithCapacity:(NSUInteger)_length];

        completionHandler(NSURLSessionResponseAllow);

    }else{

        completionHandler(NSURLSessionResponseCancel);

        [self.dataTask cancel];

        self.dataTask = nil;

    }

}

//一个数据包过来了

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data{

    NSLog(@"receive data");

    //将当前的数据添加到imageData

    [self.imageData appendData:data];

    float rate = data.length/(_length*1.0);

    [self.progress setProgress:(_progress.progress +rate) animated:NO];

}

//下载完毕

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

    NSLog(@"complete");

    if (error) {

        NSLog(@"error");

    }else{

        UIImage * img = [UIImage imageWithData:_imageData];

        self.imageView.image = img;

    }

    self.session = nil;

    self.dataTask = nil;

}

@end

转载于:https://www.cnblogs.com/huoran1120/p/5291206.html

NSURLSessionTask *sessionTask = [_sessionManager POST:URL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { for (NSUInteger i = 0; i < images.count; i++) { // 图片经过等比压缩后得到的二进制文件 NSData *imageData = UIImageJPEGRepresentation(images[i], imageScale ?: 1.f); // 默认图片的文件名, 若fileNames为nil就使用 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *imageFileName = NSStringFormat(@"%@%ld.%@",str,i,imageType?:@"jpg"); [formData appendPartWithFileData:imageData name:name fileName:fileNames ? NSStringFormat(@"%@.%@",fileNames[i],imageType?:@"jpg") : imageFileName mimeType:NSStringFormat(@"image/%@",imageType ?: @"jpg")]; } } progress:^(NSProgress * _Nonnull uploadProgress) { //上传进度 dispatch_sync(dispatch_get_main_queue(), ^{ progress ? progress(uploadProgress) : nil; }); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (_isOpenLog) {PPLog(@"responseObject = %@",responseObject);} [[self allSessionTask] removeObject:task]; success ? success(responseObject) : nil; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (_isOpenLog) {PPLog(@"error = %@",error);} [[self allSessionTask] removeObject:task]; failure ? failure(error) : nil; }]; // 添加sessionTask到数组 sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil ; return sessionTask;能否异步多线程上传
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值