• 关于NSURLSession的上传和下载


    关于NSURLSession的上传和下载

    在IOS7.0后,苹果公司新推出了一个NSURLSession来代替NSURLConnection。NSURLConnection默认是在主线程执行的。而NSURLSession是在其他线程上执行的。本篇主要实现了下载和上传,比起NSURLConnection更加简单。线程控制掌握更加清晰。

    #pragma mark - 下载

    - (IBAction)DownLoad

    {

        //1.URL 

        NSString *urlStr = @"http://she.21cn.com/emotions/mingren/a/2014/0309/15/26645767.shtml";

        NSURL *url = [NSURL URLWithString:urlStr];

        

        //2.NSURLRequest

        NSURLRequest *request = [NSURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:5.0];

        

        //3.NSURLSession

        NSURLSession *session = [NSURLSessionsharedSession];

        

        NSURLSessionDownloadTask *downLoad = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

            if (error) {

                NSLog(@"error = %@",error.localizedDescription);

            }else{

                // location是下载的临时文件目录

                NSLog(@"%@", location);

                

                // 如果要保存文件,需要将文件保存至沙盒

                // 1. 根据URL获取到下载的文件名

                NSString *fileName = [urlStr lastPathComponent];

                

                // 2. 生成沙盒的路径

                NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

                NSString *path = [docs[0] stringByAppendingPathComponent:fileName];

                NSURL *toURL = [NSURL fileURLWithPath:path];

                

                // 3. 将文件从临时文件夹复制到沙盒,iOS中所有的文件操作都是使用NSFileManager

                [[NSFileManager defaultManager] copyItemAtURL:location toURL:toURL error:nil];

                

                // 4. 将图像设置到UIImageView

          

                dispatch_async(dispatch_get_main_queue(), ^{

                    UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

                    _imageView.image = image;

                });

            }

        }];

        

    //4.因为任务默认是挂起状态,需要恢复任务(执行任务)

        [downLoad resume];

    }

    - (IBAction)upLoad

    {

        // 0. 判断imageView是否有内容

        if (_imageView.image == nil) {

            NSLog(@"image view is empty");

            

            return;

        }

        

        // 0. 上传之前在界面上添加指示符

        UIActivityIndicatorView *indicator = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

        // 设置位置???

        CGSize size = _imageView.bounds.size;

        indicator.center = CGPointMake(size.width / 2.0, size.height / 2.0);

        

        [self.imageView addSubview:indicator];

        [indicator startAnimating];

        

        // 1. URL

        NSString *urlStr = @"http://192.168.3.251/uploads/123.jpg";

        NSURL *url = [NSURL URLWithString:urlStr];

        

        // 2. Request -> PUT,request的默认操作是GET

        NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:5.0f];

        request.HTTPMethod = @"PUT";

        

        // *** 设置网络请求的身份验证! ***

        // 1> 授权字符串

        NSString *authStr = @"admin:123456";

        // 2> BASE64的编码,避免数据在网络上以明文传输

        // iOS,仅对NSData类型的数据提供了BASE64的编码支持

        NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];

        NSString *encodeStr = [authData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

        

        NSString *authValue = [NSString stringWithFormat:@"Basic %@", encodeStr];

        [request setValue:authValue forHTTPHeaderField:@"Authorization"];

        

        // 3. Session

        NSURLSession *session = [NSURLSessionsharedSession];

        

        // 4. UploadTask

        NSData *imageData = UIImageJPEGRepresentation(_imageView.image, 0.75);

        NSURLSessionUploadTask *upload = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

            

            // 上传完成后,data参数转换成string就是服务器返回的内容

            NSString *str = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];

            NSLog(@"OK -> %@", str);

            

            if (error != nil) {

                NSLog(@"ERROR -> %@", error.localizedDescription);

            } else {

                

            }

            

            [NSThreadsleepForTimeInterval:5.0f];

            

            dispatch_async(dispatch_get_main_queue(), ^{

                [indicator stopAnimating];

                

                [indicator removeFromSuperview];

            });

        }];

        

        [upload resume];

    }

  • 相关阅读:
    操作系统
    MarkDown语法实操
    mac 添加环境变量
    在django中建立mysql数据表时发生的低级错误
    models.Book.object.get()与models.Book.object.filter()区别
    django中数据库操作时distinct的用法
    ‘,’逗号并不是字符串的拼接方式
    django单表操作中update_or_create不能更新多于一个数据的信息
    在python中terminal中建立mysql数据库,无法再models.py 文件中建立数据库信息
    booleanfield()和booleanfield(default=True)在数据库的表中无法插入
  • 原文地址:https://www.cnblogs.com/yinqiang/p/3592954.html
Copyright © 2020-2023  润新知