zoukankan      html  css  js  c++  java
  • 苹果原生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];
    
    }
    下载
    #pragma mark -上传
    - (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];
    
    }
    上传
  • 相关阅读:
    Asp.net2.0 中自定义过滤器对Response内容进行处理 dodo
    自动化测试工具 dodo
    TestDriven.NET 2.0——单元测试的好助手(转) dodo
    JS弹出窗口的运用与技巧 dodo
    ElasticSearch 简介 规格严格
    修改PostgreSQL字段长度导致cached plan must not change result type错误 规格严格
    Linux系统更改时区(转) 规格严格
    mvn编译“Cannot find matching toolchain definitions for the following toolchain types“报错解决方法 规格严格
    ElasticSearch 集群 & 数据备份 & 优化 规格严格
    Elasticsearch黑鸟教程22:索引模板的详细介绍 规格严格
  • 原文地址:https://www.cnblogs.com/zhangyang17/p/3597623.html
Copyright © 2011-2022 走看看